0

ダイナミックDLLの使い方を学んでいます。DLLライブラリに2つの関数を作成しました。

DWORD fn1(VOID);
DWORD fn2(WCHAR*);

defファイルを使用してエクスポートしました

EXPORTS
fn1
fn2

fn1をロードして使用すると、すべて問題ありませんが、2番目は問題を引き起こしていますRun-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.

ポインタは次のように定義されます。

typedef DWORD (WINAPI *fn1)(void);
typedef DWORD (WINAPI *fn2)( WCHAR* );

このようにロードされます:

fn1 first = NULL;
fn2 second = NULL;
first = (fn1) GetProcAddress( dll,  "fn1" ); 
second = (fn2) GetProcAddress( dll,  "fn2" ); 

何が問題を引き起こす可能性があるのか​​、私を助けてくれませんか?アプリケーションを「続行」すると正常に動作します...

4

1 に答える 1

2

明らかに、関数ポインタ型の宣言は正しくありません。スニペットでも一致しません。WINAPIとして宣言しました。これは、呼び出し規約を__stdcallに設定するマクロです。ただし、同じ属性で実際の関数を宣言していません。デフォルトは__cdeclです。

引数がないため、呼び出し規約を間違えてもスタックのバランスが崩れることfn1はありません。のために行いfn2ます。生成されたコードは、__ cdeclで要求されているように、関数呼び出しの後に渡された引数をスタックからポップしません。

修正するにはWINAPIを削除してください。

于 2012-10-23T17:07:01.580 に答える