1.简要介绍
a.在函数名和返回值之间存在调用约定,调用约定用来协商传参的方式,内容如图:
b.从微软官方文档可以看到,导出函数务必遵守__sytdcall约定:
c.dll导出方式有以下两种:
2.创建DLL工程
a.打开vs工程新建“具有导出向的动态链接库”,默认工程微软给了示例,包含导出类、函数和变量,保留自己用到的,此处导出一个Add函数出来。
头文件中:
#ifdef DLLEXPORT_EXPORTS
#define DLLEXPORT_API __declspec(dllexport)
#else
#define DLLEXPORT_API __declspec(dllimport)
#endif
DLLEXPORT_API int Add(int a, int b);
cpp文件中:
DLLEXPORT_API int Add(int a, int b)
{
return a + b;
}
编译后则会在Debug目录生成dll和lib文件。
再新建一个控制台应用工程,只需包含上述DLL的头文件和lib文件目录即可在工程里调用Add函数。
如果C++导出的dll工程给C语言使用,那么在导出的时候需添加宏定义,因为两种语言对函数的解释方法不同。
#ifdef __cplusplus
extern "C"
{
#endif
DLLEXPORT_API int Add(int a, int b)
#ifdef _cplusplus
}
#endif
b.def的方式导出函数,优点是导出的函数名比较清楚,不需要在函数的声明和定义前增加DLLEXPORT_API。
操作方法:
①选中项目右击添加新建项,代码->模块定义文件.def,在源文件中会增加.def文件,在def文件中修改如下,EXPORTS后面增加导出的函数名。
def文件
LIBRARY DLLExport
EXPORTS
Add
头文件
int Add(int a, int b);
cpp文件
int Add(int a, int b)
{
return a + b;
}
此时再次重新编译后,运行控制台工程同样能够执行。
备注:如果想取消使用def文件,右击项目打开属性,在链接器->输入->模块定义文件中,删除def文件即可。