私はWinXPとVista64の両方で実行する必要のあるアプリケーションを持っています。私のプログラムでは、Vistaでは動作するようにQueryFullProcessImageName()が必要ですが、XPでは動作しません。ランタイムチェック失敗#0 kernel32.dllからQueryFullProcessImageNameをロード
Win32Pと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ファイルからまっすぐですので、なぜそれがうんざりしているのか理解できません。どんな助け?私はたくさんの変種を試しましたが、運はありません。