动态链接库知识点归纳之二(如何添加类,如何解决名字改变问题)
上一篇我们介绍了如何使用DLL,以及DLL的相关概念(点击打开链接http://blog.csdn.net/u014028070/article/details/38503225)
我们不仅可以再DLL中导出函数,还可以导出一个c++的类(仍以上篇文章中所建立的程序为例)
(1) 首先我们在dll.h中定义一个类,具体代码如下图。这里定义的类只做简单的演示.
(2) 在定义类的时候,我们在Class与类名中加入导出标志,实现这个类是导出类,然后我们在DLL的源文件中实现类的两个函数。
(3) 然后我们队DLL进行重新编译,再把.lib和.h和.dll重新拷贝到相应的文件夹下面。
(4) 我们在应用程序testdll中建立两个按钮,其属性如下图,并建立消息响应函数,添加如下代码,如下图。
(5) 点击运行,对话框上输出相应的文字,成功引用c++的类。
解决名字改编问题
C++编译器在对我们已经写好的DLL生成时,会自己把导出函数的名字改编,不同的编译器使用的名字改编规则不一样,这样会导致一个严重的问题,我们在使用不同编译器生成的DLL时,就会出现问题。(此文章中我们使用的都是同样的编译器VS,所以在此不会出现问题,但是这里仍然要总结一下),我们希望DLL中的导出函数名字不会变,这样的结果,想必是最好的。方法有两种。
方法一:使用限定符
(1) 使用限定符extern “C”,在DLL中在导出函数的定义中加上extern “C”,它可以解决C++和C语言之间的名字改编的问题。具体修改办法如下
(2) 但是此方法有缺点,类的函数的名字改编问题他不能解决,我们果断使用下一种高大上的方法。
定义模块定义文件解决名字改编(方法二)
(1) 模块定义文件(.def),为了方便,我们重新建立一个DLL,以便思路更清晰
(2) 我们在工程目录下,先建立一个文本文档,在修改其后缀名,改为.def,
(3) 我们在项目中,把此模块定义文件添加进来,编辑如下代码
此时 我们必须打开VS ,在模块定义文件中输入我们定义的文件名字,如下图
(4) 此时我们使用dumpbin .exe查询到处函数的,函数名字没有改变。.问题解决成功。
下一篇,将会总结一下,如何动态的以显式的方式加载DLL。(点击打开链接http://blog.csdn.net/u014028070/article/details/38513719)