0

私の問題は、MSVS 2010 C++ コンパイラが別の dll からランタイム (GetProcAddress+GetModuleHandle) で解決された関数呼び出しから戻った後、コンパイラがこのようにスタックを整列しようとする方法でコードを生成していることです。

   CALL DWORD PTR DS:[2000367C]             ;  apiresolvedinruntime.dll
   ADD ESP,12                               ;  <- this is the stack alignment

もちろん、これは戻りアドレスを上書きしており、プログラムがクラッシュします。実際にすべきではないのにコンパイラがスタックを整列させる理由を誰かが説明してくれますか?

4

1 に答える 1

4

正しい呼び出し規則を使用して、ランタイム ロード関数を呼び出していません。呼び出し規約は、スタックに何が起こるかのデフォルトの処理を指定します。ほとんどの場合、DLL は__stdcall呼び出し規約 (Windows DLL が使用するものなど) を使用してコンパイルされました。これは、呼び出された関数がスタックをクリーンアップすることになっていることを指定しますが、呼び出しコードは、__cdecl呼び出し規約を使用して関数ポインターで宣言されました。 (これがデフォルトです)。では、関数は可変引数をサポートするため、呼び出された関数は渡された引数の__cdecl数がわからないため、呼び出し元はスタックのクリーンアップを行う必要があります。

DLL と呼び出しコードが同じ呼び出し規則を使用してコンパイルされていることを確認する必要があります。

于 2012-07-01T00:11:33.150 に答える