我正在爲MinGW,32位模式構建一個用於源代碼的應用程序(PCSX)的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
功能,因爲它似乎米atter爲這個錯誤,但它不會改變結果。
編輯: 代碼調用:
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