質問

私は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必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top