DLL的分类

来源:互联网 发布:av淘宝2017年最新地址 编辑:程序博客网 时间:2024/05/16 15:21

微软的Visual C++支持三种DLL,它们分别是

Non-MFC Dll(非MFC动态库)

Regular Dll(常规DLL)

Extension Dll(扩展DLL)

(即非mfcDLL、mfc规则DLL,mfc扩展DLL) 

1、Non-MFCDLL(非MFC动态库) 
  这种动态链接库指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。如果建立的DLL不需要使用MFC,那么应该建立Non-MFCDLL,因为使用MFC会增大用户库的大小,从而浪费用户的磁盘和内存空间。 

2、RegularDLL(常规DLL)----有一个继承CWinApp的类

一个明显的特点是在源文件里有一个继承CWinApp的类 (虽然从CWinApp派生,但没有消息循环)

  这种动态链接库和下述的ExtensionDll一样,是用MFC类库编写的,它的一个明显的特点是在源文件里有一个继承CWinApp的类(注意:此类DLL虽然从CWinApp派生,但没有消息循环),被导出的函数是C函数、C++类或者C++成员函数(注意不要把术语C++类与MFC的微软基础C++类相混淆),调用常规DLL的应用程序不必是MFC应用程序,只要是能调用类C函数的应用程序就可以,它们可以是在VisualC++、Delphi、VisualBasic、BorlandC等编译环境下利用DLL开发应用程序。

常规DLL又可细分成静态链接到MFC和动态链接到MFC两种:    

(1)静态连接到MFC的动态连接库只被VC的专业般和企业版所支持。该类DLL里的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。输出函数有如下形式: 

extern"C"EXPORTYourExportedFunction(); 
  如果没有extern"C"修饰,输出函数仅仅能从C++代码中调用。 
(2)动态链接到MFC的常规DLL里的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。所有从DLL输出的函数应该以如下语句开始: 
AFX_MANAGE_STATE(AfxGetStaticModuleState()) 
此语句用来正确地切换MFC模块状态。 
3、ExtensionDll(扩展DLL)------没有一个从CWinApp派生的对象 
  这种动态链接库是使用MFC的动态链接版本所创建的,并且它只被用MFC类库所编写的应用程序所调用。例如你已经创建了一个从MFC的CtoolBar类的派生类用于创建一个新的工具栏,为了导出这个类,你必须把它放到一个MFC扩展的DLL中。扩展DLL和常规DLL不一样,它没有一个从CWinApp继承而来的类的对象,所以,开发人员必须在DLL中的DllMain函数添加初始化代码和结束代码。与常规DLL相比,扩展的DLL有如下不同点:    1)它没有一个从CWinApp派生的对象; 
2)它必须有一个DLLMain函数; 

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

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

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