您的位置:首页 > 其它

关于MFC中DLL的制作和调用

2015-12-06 21:11 232 查看

在做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的工程中即可。

导出:编写好DLL文件之后,要想使用它的函数必须先进性导出,此时就要在函数定义前加 _declspec(dllexport);
导入:应用程序要想使用dll的函数必须在使用前利用extern声明外部函数,然后才能用。而这里的extern可以用 _declspec(dllimport)代替。两者相比,后者是调用动态链接库专用,编译器生成的代码更高效;
导入导出的说明的添加可以一次性完成,这个方法就是创建一个头文件。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、一同添加到应用程序文件夹中,头文件不是添加到配置中而是引入到工程中;
过程图解:图解做不出来。。。。改天上图吧。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: