两种方式实现DLL导出函数之dllexport与def文件导出
Go to file
Gentleman 0c1d94e590 Initial commit 2021-10-19 15:59:40 +08:00
src Initial commit 2021-10-19 07:50:07 +08:00
LICENSE Initial commit 2021-10-18 23:51:12 +00:00
README.md Initial commit 2021-10-19 15:59:40 +08:00

README.md

两种方式实现DLL导出函数之dllexport与def文件导出

背景

我们开发DLL的时候大部分都会导出函数。对于导出函数常用的有两种方式一种是使用 dllexport 关键字导出,另一种是使用 .def 文件导出。我个人比较喜欢用后一种方式导出函数,因为用起来比较省心、方便。

现在,我就把这部分知识整理成文档,分享给大家。

实现过程

dllexport关键字方法

这种方法就是在函数声明中加上 __declspec(dllexport) 关键字,同时也要加上 extern "C" 这个前缀加上extern "C"后会指示编译器这部分代码按C语言的进行编译而不是C++的。

那么, __declspec(dllexport) 关键字导出函数的代码如下所示:

// 方法一 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)”文件,并输入文件名称,点击“添加”按钮,即可成功添加。

添加成功后,我们在新建的 .def 模块定义文件中添加 “EXPORTS” 关键字段这个表示DLL的导出函数位置。然后在 “EXPORTS” 字段下面添加要导出函数的名称即可。如下图,导出 “MyExportFunc_def” 这个函数。注意,只需写文件名即可。

这样对于要导出的函数我们按正常编写的方式编写即可不需要额外添加任何关键字只需要把要导出的函数的函数名称放在“EXPORTS”字段下面就可以成功导出函数。

// 方法一 def文件
BOOL MyExportFunc_def(char *pszText, char *pszCaption)
{
	::MessageBox(NULL, pszText, pszCaption, MB_OK);

	return TRUE;
}

程序测试

我们对上面的DLL工程项目进行编译链接生成DLL文件。然后使用“DEPENDS.EXE”工具查看新生成的DLL文件的导出函数。我们可以看到上述分别使用两种导出函数方法导出的导出函数均成功导出。

总结

对于上面两种导出方法来说,个人推荐 .def 模块定义文件 导出方式要注意的是要记得自己手动添加这个文件并在文件中添加“EXPORTS”导出字段。