Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14523751
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:28:03

下载本文示例代码
  摘要:本文比较了Visual C 所支持的三种动态链接库,列出了各自不同的特点和应用场合,详细地描述了三种动态链接库的建立和调用的方法。  关键字:动态链接库;导出函数;调用  引言  较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序的EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试;而且,一些模块的功能可能较为通用,在构造其它软件系统时仍会被使用。   Windows系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的动态链接库(Dynamic Linkable Library,DLL)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。  动态链接库概述  动态链接库技术是Windows最重要的实现技术之一,Windows的许多新功能、新特性都是通过DLL来实现的。其实,Windows本身就是由许多DLL组成的,它最基本的三大组成模块Kernel、GDI和User都是DLL。  一般来说,DLL是一种磁盘文件,以.dll、.DRV、.FON、.SYS和许多以.EXE为扩展名的系统文件都可以是DLL。它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。如果与其它DLL之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL模块中包含各种导出函数,用于向外界提供服务,Windows在加载DLL模块时将进程函数调用与DLL文件的导出函数相匹配。DLL可以有自己的数据段,但没有自己的堆栈,DLL模块需要的堆栈内存都是从运行进程的堆栈中分配出来的,使用与调用它的应用程序相同的堆栈模式;一个DLL在内存中只有一个实例;DLL实现了代码封装性;DLL的编制与具体的编程语言及编译器无关。  动态链接库的分类  微软的Visual C 支持三种DLL,它们分别是Non-MFC Dll(非MFC动态库)、Regular Dll(常规DLL)、Extension Dll(扩展DLL)。  1、Non-MFC DLL(非MFC动态库)  这种动态链接库指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。如果建立的DLL不需要使用MFC,那么应该建立Non-MFC DLL,因为使用MFC会增大用户库的大小,从而浪费用户的磁盘和内存空间。  2、Regular DLL(常规DLL)  这种动态链接库和下述的Extension Dll一样,是用MFC类库编写的,它的一个明显的特点是在源文件里有一个继承CWinApp的类(注意:此类DLL虽然从CWinApp派生,但没有消息循环),被导出的函数是C函数、C 类或者C 成员函数(注意不要把术语C 类与MFC的微软基础C 类相混淆),调用常规DLL的应用程序不必是MFC应用程序,只要是能调用类C函数的应用程序就可以,它们可以是在Visual C 、Delphi、Visual Basic、Borland C等编译环境下利用DLL开发应用程序。常规DLL又可细分成静态链接到MFC和动态链接到MFC两种:  (1)静态连接到MFC的动态连接库只被VC的专业般和企业版所支持。该类DLL里的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。输出函数有如下形式: extern "C" EXPORT YourExportedFunction( );  如果没有extern "C"修饰,输出函数仅仅能从C 代码中调用。  (2)动态链接到MFC的常规DLL里的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。所有从DLL输出的函数应该以如下语句开始: AFX_MANAGE_STATE(AfxGetStaticModuleState( ))  此语句用来正确地切换MFC模块状态。  3、Extension Dll(扩展DLL)  这种动态链接库是使用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的初始化函数。共2页。 1 2 :   摘要:本文比较了Visual C 所支持的三种动态链接库,列出了各自不同的特点和应用场合,详细地描述了三种动态链接库的建立和调用的方法。  关键字:动态链接库;导出函数;调用  引言  较大的应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。在构造软件系统时,如果将所有模块的源代码都静态编译到整个应用程序的EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元测试;而且,一些模块的功能可能较为通用,在构造其它软件系统时仍会被使用。   Windows系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的动态链接库(Dynamic Linkable Library,DLL)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。  动态链接库概述  动态链接库技术是Windows最重要的实现技术之一,Windows的许多新功能、新特性都是通过DLL来实现的。其实,Windows本身就是由许多DLL组成的,它最基本的三大组成模块Kernel、GDI和User都是DLL。  一般来说,DLL是一种磁盘文件,以.dll、.DRV、.FON、.SYS和许多以.EXE为扩展名的系统文件都可以是DLL。它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的一部分。如果与其它DLL之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL模块中包含各种导出函数,用于向外界提供服务,Windows在加载DLL模块时将进程函数调用与DLL文件的导出函数相匹配。DLL可以有自己的数据段,但没有自己的堆栈,DLL模块需要的堆栈内存都是从运行进程的堆栈中分配出来的,使用与调用它的应用程序相同的堆栈模式;一个DLL在内存中只有一个实例;DLL实现了代码封装性;DLL的编制与具体的编程语言及编译器无关。  动态链接库的分类  微软的Visual C 支持三种DLL,它们分别是Non-MFC Dll(非MFC动态库)、Regular Dll(常规DLL)、Extension Dll(扩展DLL)。  1、Non-MFC DLL(非MFC动态库)  这种动态链接库指的是不用MFC的类库结构,直接用C语言写的DLL,其导出的函数是标准的C接口,能被非MFC或MFC编写的应用程序所调用。如果建立的DLL不需要使用MFC,那么应该建立Non-MFC DLL,因为使用MFC会增大用户库的大小,从而浪费用户的磁盘和内存空间。  2、Regular DLL(常规DLL)  这种动态链接库和下述的Extension Dll一样,是用MFC类库编写的,它的一个明显的特点是在源文件里有一个继承CWinApp的类(注意:此类DLL虽然从CWinApp派生,但没有消息循环),被导出的函数是C函数、C 类或者C 成员函数(注意不要把术语C 类与MFC的微软基础C 类相混淆),调用常规DLL的应用程序不必是MFC应用程序,只要是能调用类C函数的应用程序就可以,它们可以是在Visual C 、Delphi、Visual Basic、Borland C等编译环境下利用DLL开发应用程序。常规DLL又可细分成静态链接到MFC和动态链接到MFC两种:  (1)静态连接到MFC的动态连接库只被VC的专业般和企业版所支持。该类DLL里的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。输出函数有如下形式: extern "C" EXPORT YourExportedFunction( );  如果没有extern "C"修饰,输出函数仅仅能从C 代码中调用。  (2)动态链接到MFC的常规DLL里的输出函数可以被任意Win32程序使用,包括使用MFC的应用程序。所有从DLL输出的函数应该以如下语句开始: AFX_MANAGE_STATE(AfxGetStaticModuleState( ))  此语句用来正确地切换MFC模块状态。  3、Extension Dll(扩展DLL)  这种动态链接库是使用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的初始化函数。共2页。 1 2 : 下载本文示例代码


Visual C 中动态链接库技术浅谈Visual C 中动态链接库技术浅谈Visual C 中动态链接库技术浅谈Visual C 中动态链接库技术浅谈Visual C 中动态链接库技术浅谈Visual C 中动态链接库技术浅谈Visual C 中动态链接库技术浅谈Visual C 中动态链接库技术浅谈Visual C 中动态链接库技术浅谈Visual C 中动态链接库技术浅谈Visual C 中动态链接库技术浅谈Visual C 中动态链接库技术浅谈Visual C 中动态链接库技术浅谈Visual C 中动态链接库技术浅谈Visual C 中动态链接库技术浅谈
阅读(159) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~