动态链接库知识点归纳之二(如何添加类,如何解决名字改变问题)

上一篇我们介绍了如何使用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

 

 

 

 

posted @ 2014-08-12 09:29  不矜不伐的小学生  阅读(471)  评论(0编辑  收藏  举报