# 两种方式实现DLL导出函数之dllexport与def文件导出
# 背景
我们开发DLL的时候,大部分都会导出函数。对于导出函数,常用的有两种方式,一种是使用 dllexport 关键字导出,另一种是使用 .def 文件导出。我个人比较喜欢用后一种方式导出函数,因为用起来比较省心、方便。
现在,我就把这部分知识整理成文档,分享给大家。
# 实现过程
## dllexport关键字方法
这种方法就是在函数声明中加上 \_\_declspec(dllexport) 关键字,同时也要加上 extern "C" 这个前缀,加上extern "C"后,会指示编译器这部分代码按C语言的进行编译,而不是C++的。
那么, \_\_declspec(dllexport) 关键字导出函数的代码如下所示:
```c++
// 方法一 dllexport
extern "C" __declspec(dllexport) BOOL MyExportFunc_dllexport(char *pszText, char *pszCaption)
{
::MessageBox(NULL, pszText, pszCaption, MB_OK);
return TRUE;
}
```
## def文件方法
def文件方法相对于上面介绍的 \_\_declspec(dllexport) 要更简便,而且很容易理解使用。
一般我们创建的DLL工程是没有 .def 这个文件的,需要我们创建并添加到项目工程中,添加方式如下:
选中工程项目,右击选择“添加”,并选中“新建项”,在新建项中选择“Visual C++”下的“代码”中的“模块定义文件(.def)”文件,并输入文件名称,点击“添加”按钮,即可成功添加。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/c219201b6e95976a5be78a0ecf58fb59.writebug)
添加成功后,我们在新建的 .def 模块定义文件中添加 “EXPORTS” 关键字段,这个表示DLL的导出函数位置。然后在 “EXPORTS” 字段下面添加要导出函数的名称即可。如下图,导出 “MyExportFunc_def” 这个函数。注意,只需写文件名即可。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/509763b8c8b1760011ec501c4bfeb715.writebug)
这样,对于要导出的函数,我们按正常编写的方式编写即可,不需要额外添加任何关键字,只需要把要导出的函数的函数名称放在“EXPORTS”字段下面就可以成功导出函数。
```c++
// 方法一 def文件
BOOL MyExportFunc_def(char *pszText, char *pszCaption)
{
::MessageBox(NULL, pszText, pszCaption, MB_OK);
return TRUE;
}
```
# 程序测试
我们对上面的DLL工程项目进行编译链接,生成DLL文件。然后使用,“DEPENDS.EXE”工具查看新生成的DLL文件的导出函数。我们可以看到上述分别使用两种导出函数方法导出的导出函数均成功导出。
![](http://www.writebug.com/myres/static/uploads/2021/10/19/6d656a399ab78772e48e04ea6f00ca7f.writebug)
# 总结
对于上面两种导出方法来说,个人推荐 .def 模块定义文件 导出方式,要注意的是,要记得自己手动添加这个文件,并在文件中添加“EXPORTS”导出字段。