kernel32.dllのからのランタイムチェックの失敗#0積載QueryFullProcessImageName
-
22-08-2019 - |
質問
私はWinXPのとVista64上の両方を実行する必要があるアプリケーションを持っています。私のプログラムは、Vista上ではなく、XP上で動作するようにQueryFullProcessImageNameを()が必要です。
私は、同じ実行ファイルが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の値が正しく関数呼び出しの間で保存されませんでした。これは通常、別の呼び出し規約で宣言された関数ポインタで1つの呼び出し規約で宣言された関数を呼び出した結果である。
typedefが、それはめちゃくちゃだ、なぜ私が理解することはできません.hファイルからまっすぐです。任意のヘルプ?私は変種が、運のトンを試してみました。
解決
は、
へのtypedefを変更する必要がありますtypedef BOOL (WINAPI *LPQueryFullProcessImageName)(
HANDLE hProcess, DWORD dwFlags, LPSTR lpExeName, PDWORD lpdwSize );
WINBASEAPIは、静的な依存関係を宣言するために使用され、それが__stdcall呼び出し規約を指定していません。あなたはのGetProcAddress()を使用しますので、静的な依存関係は、あなたに興味のないですが、あなたはまだ適切なコールinvokationため__stdcall必要があります。
所属していません StackOverflow