1

VC++ バージョン 8 でアプリケーションを作成しようとしています。DLL があり、Dependency Walker を使用して、DLL で使用できる API のリストを取得しました。

DLL をロードすることはできますが、DLL でいくつかの API を呼び出そうとすると、このデバッグ エラーが発生します。

「実行時チェックの失敗 #0 - ESP の値が関数呼び出し全体で適切に保存されませんでした。これは通常、ある呼び出し規則で宣言された関数を、別の呼び出し規則で宣言された関数ポインターで呼び出した結果です。」

typedef void ( WINAPI *RECEIVE_CALLBACK)int*, int );

typedef void (WINAPI *MYPROC)(RECEIVE_CALLBACK);

     .....
     .....

handleDll = LoadLibraryW((LPCWSTR)L"Example.dll");

ProcAdd = (MYPROC) GetProcAddress(handleDll, "_DLLAPI_Call1@8"); 

(ProcAdd) ( (RECEIVE_CALLBACK) ReceiveFunc); 

最後の行が実行されると、上記のエラーが発生します。その理由は何ですか?

4

1 に答える 1

4

MYPROC 関数ポインターの宣言が間違っています。この関数は、1 つではなく 2 つの引数を取ります。名前の @8 の部分からわかるように、引数の値には 8 バイトのスタック領域が必要です。1 つの引数 (4 バイト ポインター) で呼び出すと、常にスタックのバランスが崩れます。

MYPROC 宣言を修正する必要があります。

于 2013-03-22T14:27:07.587 に答える