私はソースがあるアプリケーション(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
どのようなコードがこの関数を呼び出していますか? – Mat
呼び出しコードを追加しましたが、何も気にしません。完全なソースも利用可能です。 – RobotRock