【问题标题】:Run-Time Check Failure #0 loading QueryFullProcessImageName from kernel32.dll运行时检查失败 #0 从 kernel32.dll 加载 QueryFullProcessImageName
【发布时间】:2010-10-16 07:52:48
【问题描述】:

我有一个需要在 WinXP 和 Vista64 上运行的应用程序。我的程序需要 QueryFullProcessImageName() 才能在 Vista 上运行,但不能在 XP 上运行。

我尝试通过 kernel32.dll 加载 QueryFullProcessImageName()(而不是静态链接),以便相同的可执行文件可以在 WinXP 和 Vista 上运行。加载它的代码是:

//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
    );

不幸的是,当函数指针被取消引用时,我在 Vista 上遇到了运行时错误:

运行时检查失败 #0 - ESP 的值未在函数调用中正确保存。这通常是用一个调用约定声明的函数和一个用不同调用约定声明的函数指针调用的结果。

typedef 直接来自 .h 文件,所以我不明白为什么它会搞砸。有什么帮助吗?我尝试了很多变种,但没有运气。

【问题讨论】:

    标签: c++ winapi windows-vista function-pointers


    【解决方案1】:

    你应该把 typedef 改成

    typedef BOOL (WINAPI *LPQueryFullProcessImageName)(
         HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD lpdwSize );
    

    WINBASEAPI 用于声明静态依赖,它没有指定 __stdcall 调用约定。您使用 GetProcAddress() ,因此您对静态依赖不感兴趣,但您仍然需要 __stdcall 才能进行正确的调用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多