8

WinXPとVista64の両方で実行する必要があるアプリケーションがあります。私のプログラムでは、Vistaで動作するためにQueryFullProcessImageName()が必要ですが、XPでは動作しません。

同じ実行可能ファイルをWinXPとVistaの両方で実行できるように、kernel32.dllを介して(静的にリンクするのではなく)QueryFullProcessImageName()をロードしようとしています。それをロードするコードは次のとおりです。

//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ファイルから直接取得されるため、混乱している理由がわかりません。何か助けはありますか?私はたくさんの変種を試しましたが、運がありません。

4

1 に答える 1

24

typedef を次のように変更する必要があります。

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

WINBASEAPI は静的な依存関係を宣言するために使用され、__stdcall 呼び出し規約を指定しません。GetProcAddress() を使用するため、静的な依存関係には関心がありませんが、適切な呼び出しを呼び出すには __stdcall が必要です。

于 2009-03-30T08:09:21.060 に答える