2012-01-22 58 views
2

我正在爲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

+0

什麼代碼調用該函數? – Mat

+0

添加了調用代碼,雖然沒有什麼奇特的。完整的源代碼也可用。 – RobotRock

回答

2

你應該堅持CALLBACK宏,因爲它是在插件頭文件和源代碼中的其他插件中完成的。

它使用mingw/GCC 4.5擴展到__attribute__((__stdcall__))。把它放在頭文件和實現文件中。

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

你應該註釋一樣,所有的回調函數,不論他們似乎工作。

+0

在歸屬事項之前還是之後?我主要嘗試了與dllexport,__stdcall__,extern的任何組合,但仍然丟失。 – RobotRock

+0

應該沒關係,你可以把它放在函數參數列表之後。確保沒有任何東西是'取消CALLBACK(或將其定義爲空的東西)。 – Mat