如果通過VC++編寫的DLL欲被其他語言編寫的程序調用,應將函數的調用方式聲明為__stdcall方式,WINAPI都采用這種方式,而C/C++缺省的調用方式卻為__cdecl。__stdcall方式與__cdecl對函數名最終生成符號的方式不同。若采用C編譯方式(在C++中需將函數聲明為extern "C"),__stdcall調用約定在輸出函數名前面加下劃線,后面加“@”符號和參數的字節數,形如_functionname@number;而__cdecl調用約定僅在輸出函數名前面加下劃線,形如_functionname。
Windows編程中常見的幾種函數類型聲明宏都是與__stdcall和__cdecl有關的(節選自windef.h):
#define CALLBACK __stdcall //這就是傳說中的回調函數
#define WINAPI __stdcall //這就是傳說中的WINAPI
#define WINAPIV __cdecl
#define APIENTRY WINAPI //DllMain的入口就在這里
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
在lib.h中,應這樣聲明add函數:
int __stdcall add(int x, int y);
在應用工程中函數指針類型應定義為:
typedef int(__stdcall *lpAddFun)(int, int);
若在lib.h中將函數聲明為__stdcall調用,而應用工程中仍使用typedef int (* lpAddFun)(int,int),運行時將發生錯誤(因為類型不匹配,在應用工程中仍然是缺省的__cdecl調用),