带MFC的dll

DinS          Written on 2017/6/5

既然用了dll,那么一定是windows,既然是windows开发,那么避免不了MFC,于是带MFC的dll也就是必然的了,本文探讨如何制作并使用带MFC的dll。有关非MFC的dll见《动态库(dll)》。

一、关于各种选项的说明

新建工程->MFC DLL,会弹出这个对话框,里面的的内容值得说一说

第一个是共享MFC DLL:
链接成EXE的时候,没有将MFC的一些DLL包含进来,所以EXE文件较小,但是运行时候要求系统中要有相关的DLL文件。

第二个:静态链接MFC DLL
链接成EXE的时候,将所用到的MFC中的函数相关代码已经包含进EXE文件,文件较大,但是可以在没有相关DLL的机器上运行

第三个:MFC 扩展DLL
这个不属于regular dll
区别在于规则DLL的内部可以使用MFC,同时可以被MFC和非MFC程序调用
而MFC扩展DLL可以导出一个MFC类的派生类,但是只能被MFC程序调用
鼠标移动到选项上也有详细的说明

自动化:
automation 允许用户在一个应用程序中操纵另外一个应用程序或组件。
例如,我们可以在应用程序中利用 Microsoft Word 或Microsoft Excel的工具,而这种使用对用户而言是透明的。自动化技术可以大大简化和加快应用程序的开发。

套接字:
是否支持Windows Sockets。网络编程需要.

二、制作regular dll

首先需要明确的是,既然使用了MFC的DLL,必然是想利用MFC里的一些内容,比如弹出个对话框,否则使用一般的DLL就足以了。从这个逻辑来讲,其导出的接口很简单,就是让一个对话框出现,而对话框里的内容就是常规的MFC编程。

新建的工程是这样的,跟MFC很像,不过没有对话框等资源。确认一下工程中有哪些文件。

最核心的是声明了一个类class CMFCRegularDLLApp : public CWinApp

注意标红的地方,导出的函数需要加上这一句话。

于是任务分成了两部分,一是MFC编程,二是导出函数。

第一部分:

第一步在资源视图添加一个对话框。

第二步使用类向导添加一个对话框类

这两步完成后就是正常的MFC编程了,比如说拉一个label到对话框

第二部分:导出函数

在MFCRegularDLL.cpp中(新建工程时会自动生成,即工程名称)首先包含刚才制作的对话框

然后实现如下函数,注意导出的前缀(当然使用.def文件也可以)

之后就可以生成项目,得到如下的文件

三、使用regular dll

新建一个基于对话框的MFC项目,给确定按钮添加事件

新建文件夹,准备三件套并导入项目

在对话框实现中先包含、导入函数

然后直接调用该函数即可

效果图

补充:还有其他的封装对话框到DLL方法,但是试验下来我感觉还是在MFCRegularDLL.cpp中导出最直接、简单。
这一对.h和.cpp就是新建工程时自动生成的用于DLL的文件,在这里面改应该也是最符合微软本意的方法吧

控制台也是可以调用MFC DLL的,并且不用附加任何东西。
新建一个控制台项目,进行必要的部署后代码如下。

效果图

调用带MFC的dll跟通常的dll流程一致。

四、某些疑问

我们应该停下来看看,上面的例子有没有什么可疑的地方?
我轻描淡写地说了一句在MFCRegularDLL.cpp实现导出函数,这里面是不是有什么问题?
首先,导出函数完全声明、定义在.cpp中,那么.h文件是不是多余的?
其次MFCRegularDLL.h和.cpp实现的是一个CMFCRegularDLLApp类,导出函数用的是自定义的对话框CDLLDialog类
这两者之间是什么关系?按理说MFCRegularDLL.cpp只跟CMFCRegularDLLApp,在里面塞入显示CDLLDialog类的函数是什么意思?

让我们来进行一些试验。既然ShowDLLDialog跟MFCRegularDLL.h没有任何关系,那就把MFCRegularDLL.h注释掉看看
结果是程序完全可以正常运行
这说明一点:.h文件并不是必须的。实际上其更多的作用是告诉调用DLL的人里面的接口有哪些,充当了文档的作用

第二个问题个人理解如下:
CMFCRegularDLLApp类只是MFC的DLL的入口,我们添加的内容通过这个入口进入到DLL中
MFCRegularDLL.h中有一个#include “resource.h”,这是MFCRegularDLL.rc的相关文件
而我们添加的对话框等资源文件是在MFCRegularDLL.rc里加的
虽然对话框CDLLDialog是一个新建的类,但是用的资源还是来自MFCRegularDLL.rc。这应该就是二者之间的关系
至于为何直接在MFCRegularDLL.cpp中塞入导出函数,应该说逻辑上只能够在这里导出,因为这里是入口
又因为导出函数的名字实际上独立于.h和.cpp,所以在这里添加也是可以理解的
当然也可以在.h中声明,.cpp中实现,这样可能看起来更加顺一点,虽然效果是一样的

五、MFC Extension DLL

MFC扩展DLL与常规DLL在制作和调用方面没有太大差别。因为与regular dll类似这里就不展开了,个人感觉这个扩展dll的作用主要是导出MFC的扩展类吧。

我也没使过。