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