وقت التشغيل تحقق الفشل # QueryFullProcessImageName 0 تحميل من KERNEL32.DLL

StackOverflow https://stackoverflow.com/questions/696306

سؤال

ولدي أحد التطبيقات التي تحتاج إلى تشغيل كل من على ويندوز إكس بي و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 الدعوة المناسبة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top