当前位置:   article > 正文

关于MFC中DLL的制作和调用_mfc dll制作及调用

mfc dll制作及调用

在做MFC程序的时候用到了DLL,所以查找总结了一下。

一. 制作DLL流程

  • 为什么都没有段落符号与标号。。。
  • 先创建DLL工程、类,编写DLL函数;编译链接产生DLL文件(普通工程产生的EXE文件,DLL产生的是DLL文件)。
  • 此时DLL文件还不能调用。应用程序要想访问某个DLL中的函数,那么该函数必须是已经被导出的函数。查看DLL中有哪些导出函数可用命令行工具:Dumpbin。命令如下:dumpbin回车—>dumpbin -exports 文件名.dll回车。
  • 这时可以看到没有导出函数。为了让DLL导出一些函数,需要在每一个将要被导出的函数前面加标识符: _declspc(dllexport)(如:_declspec(dllexport) add(int a, int b){})。再次编译链接后产生两个新文件。一个是文件名.lib,即引入库文件;另一个是文件名.exp,不重要。这时再用dumpbin命令查看,可以看到有了导出函数。
  • 然后就可以调用DLL了,利用extern声明外部函数。编译链接调用函数。
  • 编译通过,链接出错。因为找不到库文件。此时将文件名.lib复制到调用程序所在目录下,然后在VC中选择Project\Settings菜单命令,在打开的对话框中选择link选项卡,在Object\library module选项中输入文件名.lib。
  • 再次build,这时可以用dunpbin -import 文件名.exe 来查看调用程序生成的exe文件的输入信息以及加载的DLL信息。
  • 编译运行又出错了,这次是因为调用DLL文件不在调用目录中,也就是说它既不在该工程的执行目录中,也不在工程所在目录中(工程的执行目录是指写在工程配置中的目录,工程所在目录就是工程所在Debug文件夹),也不在系统目录中(system、system32等),也不在path环境变量包含的路径中(这四个路径是VC调用文件一次会先后遍历的几个路径)。将调用的DLL文件复制到该工程的Debug文件夹中即可。

二. 隐式调用DLL中函数的导入与导出

这部分内容,和上面的内容差不多,但主要出自《VC++深入详解》,其中更深入地对DLL的调用进行了分析和优化。上面的内容是最原始最基础的制作和导入导出原理,而以下则是在那基础上的进一步优化,添加了一个头文件。而在实际从VC中建立工程时,一切都是便利的,已经包含了的,头文件是现成的。只需要添加到调用DLL的工程中即可。
  1. 导出:编写好DLL文件之后,要想使用它的函数必须先进性导出,此时就要在函数定义前加 _declspec(dllexport);
  2. 导入:应用程序要想使用dll的函数必须在使用前利用extern声明外部函数,然后才能用。而这里的extern可以用 _declspec(dllimport)代替。两者相比,后者是调用动态链接库专用,编译器生成的代码更高效;
  3. 导入导出的说明的添加可以一次性完成,这个方法就是创建一个头文件。DLL中需要 _declspec(dllexport),则在dll中#define   DLL_API    _declspec(dllexport),然后#include  “头文件名.h”调用该头文件,而头文件中函数的声明前添加DLL_API即可。应用中需要 _declspec(dllimport),则在头文件中#ifdef   DLL_API    #else   #define     DLL_API  _declspec(dllimport),然后在应用cpp中 #include “头文件名.h”调用该头文件即可。利用头文件将 _declspec(export)和 _declspec(import)的添加都归集到头文件中,DLL文件和应用文件中的具体函数实现和引用就不需要再添加了。
注意:a.此方法是将引用声明变为了预编译指令,极大地简化了引用过程;
           b.头文件的另一个好处是将动态库的函数提前做了声明,这样可以让使用者直观明了地知道动态库中的个中函数功能;
           c.头文件也需要和.lib、.dll、一同添加到应用程序文件夹中,头文件不是添加到配置中而是引入到工程中;
过程图解:图解做不出来。。。。改天上图吧。


 
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/690564
推荐阅读
相关标签
  

闽ICP备14008679号