2009-03-30 11 views
6

私は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ファイルからまっすぐですので、なぜそれがうんざりしているのか理解できません。どんな助け?私はたくさんの変種を試しましたが、運はありません。

答えて

20

あなたは、静的な依存関係を宣言するために使用され

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

WINBASEAPIへのtypedefを変更する必要があり、それが__stdcall呼び出し規約を指定していません。 GetProcAddress()を使用しているので、静的な依存関係はあなたには関係ありませんが、適切な呼び出し呼び出しのためにはまだ__stdcallが必要です。

関連する問題