如果通过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
如果在dll库这样声明add函数:
int __stdcall add(int x, int y);
在应用工程中函数指针类型应定义为:typedef int(__stdcall *lpAddFun)(int, int);
__declspec(dllexport) 导出
__declspec(dllimport) 导入
--------------------------------------------------------------
Define method :
__declspec(dllexport) void __stdcall Add(int a, int b);
Use method:
方法(1) #pragma comment(lib, "xxx.lib")
//这里可能需要设置lib文件所在的目录:项目属性->Linker->General->Additional Library Directorys
方法(2) 项目属性->Linker->Input->Addtional Dependencies 里设置 "xxx.lib" (可能需要带路径)
__declspec(import) void __stdcall Add(int a, int b);
//Note: __declspec(import) 对于method是可选的,对于变量是必选的
Add(10, 11)