zoukankan      html  css  js  c++  java
  • 动态链接库知识点归纳之二(如何添加类,如何解决名字改变问题)

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

  • 相关阅读:
    Django ——Timezone 处理
    orm
    MySql系列之初识
    python并发编程之IO模型
    并发编程之协程
    GIL解释锁及进程池和线程池
    线程的互斥锁、递归锁及信号量
    守护、互斥锁、IPC和生产者消费者模型
    并发编程基础(进程)
    网络编程
  • 原文地址:https://www.cnblogs.com/zhangruilin/p/5769853.html
Copyright © 2011-2022 走看看