وقت التشغيل تحقق الفشل # QueryFullProcessImageName 0 تحميل من KERNEL32.DLL
-
22-08-2019 - |
سؤال
ولدي أحد التطبيقات التي تحتاج إلى تشغيل كل من على ويندوز إكس بي وVista64. يتطلب برنامجي QueryFullProcessImageName () للعمل على ويندوز فيستا ولكن ليس على XP.
وأنا أحاول أن تحميل QueryFullProcessImageName () (بدلا من ربط ثابت) عن طريق KERNEL32.DLL بحيث نفس قابل للتنفيذ يمكن تشغيلها على كل من ويندوز إكس بي وفيستا. رمز الذي يقوم بتحميل هو:
//only gets called on vista
bool LoadQueryFullProcessImageName()
{
HMODULE hDLL = LoadLibrary("kernel32.dll");
if (!hDLL) return(0);
//Now use pointer to get access to functions defined in DLL
fpQueryFullProcessImageName = (LPQueryFullProcessImageName)GetProcAddress(hDLL, "QueryFullProcessImageNameA"); //ANSI version
if (!fpQueryFullProcessImageName)
return false;
return true;
}
وعلى typedef وهو
typedef WINBASEAPI
BOOL (*LPQueryFullProcessImageName)(
__in HANDLE hProcess,
__in DWORD dwFlags,
__out_ecount_part(*lpdwSize, *lpdwSize) LPSTR lpExeName,
__inout PDWORD lpdwSize
);
للأسف، أنا الحصول على خطأ وقت التشغيل ويندوز فيستا عندما ألغى الإشارة القيمة مؤشر الدالة:
ووقت التشغيل تحقق الفشل # 0 - لم يتم حفظ قيمة ESP بشكل صحيح عبر استدعاء دالة. هذا هو عادة نتيجة استدعاء دالة أعلن مع اصطلاح استدعاء واحد مع مؤشر دالة تعريف باستخدام اصطلاح استدعاء مختلفة.
ووtypedef وغير مباشرة من ملف .h لذلك لا أستطيع أن أفهم لماذا انها لخبطة. أي مساعدة؟ لقد حاولت طن من المتغيرات ولكن لم الحظ.
المحلول
ويجب عليك تغيير الرموز المميزة ل typedef إلى
typedef BOOL (WINAPI *LPQueryFullProcessImageName)(
HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD lpdwSize );
ويستخدم WINBASEAPI لإعلان تبعيات ثابتة وأنها لا تحدد الاتفاقية __stdcall الدعوة. يمكنك استخدام GetProcAddress () وهلم الاعتماد ثابتة هي لا مصلحة لكم، ولكن ما زالت هناك حاجة ل__stdcall invokation الدعوة المناسبة.