2012-01-22 13 views
2

私はソースがあるアプリケーション(PCSX)のMinGW、32ビットモードでDLLを構築しています。私は別のモジュールソースのガイドラインに従っています。DLLを使った呼び出し規約のエラー

生成エラーは、次のとおりです。

ランタイムチェックの失敗#0 - ESPの値が正しく関数呼び出しの間で保存されませんでした。これは通常、異なる呼び出し規約で宣言された関数ポインタを持つ呼び出し規約で宣言された関数を呼び出した結果です。

PSEgetLibNameは適切な結果を返します。 PADinitが上記のエラーをスローします。

// sucess, everything configured, and went OK. 
#define PSE_PAD_ERR_SUCCESS   0 

main.h

long PADinit(long flags); 

main.cの

long PADinit(long flags) { 
    return PSE_PAD_ERR_SUCCESS; 
} 
char *PSEgetLibName(void) { 
    return _("PSX-U"); 
} 

のMakefile:

# Build for Windows under MinGW 
#MINGWDBG= -DDEBUG -O0 
MINGWDBG= -DNDEBUG -O2 
#MINGWOPT= -W -Wall -mthreads -Wl,--subsystem,console $(MINGWDBG) -DHAVE_STDINT 
MINGWOPT= -W -Wall -mthreads -Wl,--subsystem,windows $(MINGWDBG) 
mingw: 
    windres win32\res.rc win32\res.o 
    gcc $(MINGWOPT) mongoose.c main.c -lws2_32 \ 
     -shared -Wl,--out-implib=$(PROG).lib -o $(PROG).dll 
    gcc $(MINGWOPT) mongoose.c main.c win32\res.o -lws2_32 -ladvapi32 \ 
     -o $(PROG).exe 

それが見えたように私は、__stdcall__cdeclで関数を宣言しようとしましたmこのエラーは発生しませんが、結果は変更されません。

編集:呼び出す コード:

plugins.h

typedef long (CALLBACK* PADinit)(long); 
... 
extern PADinit    PAD1_init; 

plugins.c

ret = PAD1_init(1); 

(PCSX用)ここで完全なソースコード: http://pcsxr.codeplex.com/SourceControl/list/changesets

+0

どのようなコードがこの関数を呼び出していますか? – Mat

+0

呼び出しコードを追加しましたが、何も気にしません。完全なソースも利用可能です。 – RobotRock

答えて

2

私はmingwがリンカ(-Wl、 - add-stdcall-alias)にパラメータを渡す必要があり、__stdcallを使用して最終的に問題を解決する必要があることが判明しました!

http://www.mingw.org/wiki/Visual_Basic_DLL

2

ますに固執する必要がありますマクロは、プラグインヘッダーファイルと参照先のソースコード内の他のプラグインで行われるため、

mingw/GCC 4.5で__attribute__((__stdcall__))に拡張されます。それをヘッダーと実装ファイルの両方に入れてください。

long CALLBACK PADinit(long flags); 
long CALLBACK PADinit(long flags) { 
    return PSE_PAD_ERR_SUCCESS; 
} 

あなたは、彼らが働くように見えるかどうか、そのようなすべてのコールバック関数に注釈を付ける必要があります。

+0

returntypeの前後に配置していますか?私は主にdllexport、__stdcall__、externとの任意の組み合わせを試しましたが、まだ失われています。 – RobotRock

+0

問題ではありません。関数の引数リストの後ろに置くこともできます。CALLBACKを 'undef'しているものが何もないことを確認してください(または空のものに定義する)。 – Mat

関連する問題