DLL 几种类型

1、Non-MFCDLL(非MFC动态库)

  这种动态链接库指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。

如果建立的DLL不需要使用MFC,那么应该建立Non-MFCDLL,因为使用MFC会增大用户库的大小,从而浪费用户的磁盘和内存空间。 

DLL 几种类型


DLL 几种类型




2. MFC Regular DLL(MFC规则DLL)

  MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;

用MFC类库编写的,它的一个明显的特点是在源文件里有一个继承CWinApp的类(注意:此类DLL虽然从CWinApp派生,但没有消息循环),调用常规DLL的应用程序不必是MFC应用程序,它们可以是在Visual C++、Dephi、Visual Basic、Borland C等编译环境下利用DLL开发应用程序。

  DLL 几种类型

(1) 它是MFC的
“是MFC的”意味着可以在这种DLL的内部使用MFC;

(2) 它是规则的
“是规则的”意味着它不同于MFC扩展DLL,在MFC规则DLL的内部虽然可以使用MFC,但是其与应用程序的接口不能是MFC。
而MFC扩展DLL与应用程序的接口可以是MFC,可以从MFC扩展DLL中导出一个MFC类的派生类。
Regular DLL能够被所有支持DLL技术的语言所编写的应用程序调用,当然也包括使用MFC的应用程序。在这种动态连接库中,包含一个从CWinApp继承下来的类,DllMain函数则由MFC自动提供。

(1)静态链接到MFC 的规则DLL
 将MFC库的代码直接生成在.dll文件中。

包括所有它需要的MFC库代码的拷贝,可以独立于MFC库,使用这种方法生成的规则DLL其程序较大,也可能包含重复的代码。

如果要进行跨平台开发,只能选择这种,编译时间要长许多.

在调用这种DLL的接口时,MFC使用DLL的资源。
因此,在静态链接到MFC 的规则DLL中不需要进行模块状态的切换。

DLL 几种类型
(2)动态链接到MFC 的规则DLL
动态链接到MFC 的规则DLL 可以和使用它的可执行文件同时动态链接到 MFC DLL 和任何MFC扩展 DLL。在使用了MFC共享库的时候,默认情况下,MFC使用主应用程序的资源句柄来加载资源模板。这样,当DLL和应用程序中存在相同ID的资源时(即所谓的资源重复问题),系统可能不能获得正确的资源。因此,对于共享MFC DLL的规则DLL,我们必须进行模块切换以使得MFC能够找到正确的资源模板。
我们可以在Visual C++中设置MFC规则DLL是静态链接到MFC DLL还是动态链接到MFC DLL。如图8,依次选择Visual C++的project -> Settings -> General菜单或选项,在Microsoft Foundation Classes中进行设置。3.1规则DLL的创建; 
与非MFCdll不同的是,在其定义里面可以引入MFC类,其他与非MFC一样

DLL 几种类型

DLL 几种类型






3.MFC Extension DLL(MFC扩展DLL)

 采用MFC的动态链接版本创建,它 只能被用MFC类库所编写的应用程序所调用。

DLL 几种类型

例如你已经创建了一个从MFC的CtoolBar类的派生类用于创建一个新的工具栏,为了导出这个类,你必须把它放到一个MFC扩展的DLL中。

扩展DLL和常规DLL不一样,它没有一个从CWinApp继承而来的类的对象,所以,开发人员必须在DLL中的DllMain函数添加初始化代码和结束代码。

支持C++接口,可以导出整个类,它要求客户程序被动态地连接到MFC库,并且客户程序和Extension   DLL要一致连接到MFC   DLL的相同版本(mfc42.dll,mfcd42.dll)

如果要用到MFC里的类,比如说某个类要继承于CView的话,就得用这种方式了。

与常规DLL相比,扩展的DLL有如下不同点:

1)它没有一个从CWinApp派生的对象; 

2)它必须有一个DLLMain函数;
3)DLLMain调用AfxInitExtensionModule函数,必须检查该函数的返回值,如果返回0,DLLMmain也返回0;  

4)如果它希望输出CRuntimeClass类型的对象或者资源(Resources),则需要提供一个初始化函数来创建一个CDynLinkLibrary对象。

并且,有必要把初始化函数输出; 

DLL 几种类型


5)使用扩展DLL的MFC应用程序必须有一个从CWinApp派生的类,而且,一般在InitInstance里调用扩展DLL的初始化函数。



DLL 几种类型