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

  • 相关阅读:
    ubuntu 14.4 apache2 django
    github上的版本和本地版本冲突的解决方法
    Javascript能做什么 不能做什么。
    django 取model字段的verbose_name值
    Django在admin模块中显示auto_now_add=True或auto_now=True的时间类型列
    合并多个python list以及合并多个 django QuerySet 的方法
    摘抄
    Python 字符串拼接
    学习HTTP
    Django 自定义模板标签和过滤器
  • 原文地址:https://www.cnblogs.com/zhangruilin/p/5769853.html
Copyright © 2011-2022 走看看