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