DLL 几种类型
1、Non-MFCDLL(非MFC动态库)
这种动态链接库指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。
如果建立的DLL不需要使用MFC,那么应该建立Non-MFCDLL,因为使用MFC会增大用户库的大小,从而浪费用户的磁盘和内存空间。
2. MFC Regular DLL(MFC规则DLL)
MFC规则DLL 包含一个继承自CWinApp的类,但其无消息循环;
用MFC类库编写的,它的一个明显的特点是在源文件里有一个继承CWinApp的类(注意:此类DLL虽然从CWinApp派生,但没有消息循环),调用常规DLL的应用程序不必是MFC应用程序,它们可以是在Visual C++、Dephi、Visual Basic、Borland C等编译环境下利用DLL开发应用程序。
包括所有它需要的MFC库代码的拷贝,可以独立于MFC库,使用这种方法生成的规则DLL其程序较大,也可能包含重复的代码。
如果要进行跨平台开发,只能选择这种,编译时间要长许多.
在调用这种DLL的接口时,MFC使用DLL的资源。3.MFC Extension DLL(MFC扩展DLL)
采用MFC的动态链接版本创建,它 只能被用MFC类库所编写的应用程序所调用。
例如你已经创建了一个从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对象。
并且,有必要把初始化函数输出;
5)使用扩展DLL的MFC应用程序必须有一个从CWinApp派生的类,而且,一般在InitInstance里调用扩展DLL的初始化函数。