第10章 DLL的开发与调用.ppt
文本预览下载声明
第10章 DLL的开发与调用 Windows系统平台提供了一种有效的编程和运行环境,可以把独立的程序模块创建为较小的DLL(Dynamic Linkable Library,动态链接库)文件,并可对它们单独编译和测试。Windows操作系统的核心功能、系统服务、应用程序服务等多数是由一组动态链接库实现的。 使用动态链接库有很多优点。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。而且当动态链接库中的函数改变后,只要不是参数改变,调用这个函数的应用程序并不需要重新编译,这在编程时是十分有用的。 通过本章的学习,读者会了解DLL的基本概念、能够使用VC实现几种类型的DLL的开发与调用操作。 10.1 DLL的基础知识 在程序开发中,比较大的应用程序,往往被划分为很多模块,这些模块以二进制的方式提供,并能完成相对独立的功能。其中一些比较通用的模块,在构造其他软件系统时,也经常用到,就把这些模块汇集起来,形成“仓库”。而动态链接库(DLL)就可以看成一种“仓库”,提供可以直接使用的变量、函数或类。 在开发和调用DLL之前,有必要了解一下动态链接库的相关概念。只有了解了动态链接库的结构和工作机制,才能灵活有效地开发和使用它。 10.1.1 DLL与LIB 与动态链接库(DLL)相对应的是静态链接库(LIB文件)。其相似之处是它们都是将一部分可执行代码以及数据放在库中供用户程序使用,而且在使用时,这些代码就象是用户程序本身的一部分。而二者的主要区别就是在使用方法上。 使用静态链接库的应用程序从函数库(LIB)得到所引用的函数的执行代码,然后把执行代码放进自身的执行文件中,这样,应用程序在运行时就可以不再需要静态函数库的支持。 使用动态链接库的应用程序只包括了用于从DLL中定位所引用的函数的信息,而没有函数具体实现,要等到程序运行时才从DLL中获得函数的实现代码。因此,使用了DLL的应用程序在运行时必须要有相应的DLL的支持。 10.1.1 DLL与LIB 如果与应用程序连接的是静态链接库,每一个应用程序在编译过程中都必须拷贝一份库的代码,这样就造成了资源的浪费,增大程序本身的代码开销。而动态链接库在编译过程中并不连接应用程序,而当应用程序运行时连接,可以与其他应用程序共享库中的函数和资源,减少了因重复拷贝而造成的应用程序的冗长和计算机资源的占用。 当对目标代码链接形成可执行文件时,静态链接形成的程序是完整的,即从一台机器复制到另一台机器就可以直接运行。相比而言,其程序的文件比较大。而动态链接生成的可执行程序在不同机器间迁移时,必须要带着相应的库,否则就不能运行。相对而言,动态链接的可执行文件本身比闲 另外,静态链接库和动态链接库还有一个区别,那就是静态链接库中不能再包含其他的动态或静态链接库,而动态链接库中还可以再包含其他的动态或静态链接库。 10.1.2 DLL与EXE DLL和EXE都是Windows下的可执行模块,在对应的文件结构上,它们也类似的:具有文件头,重定位信息表,导入动态库表等,另外,DLL作为供程序调用的服务者,主要用来提供输出变量和函数供别的程序调用。DLL文件中包含函数(或类)的执行代码还包含导出的函数表和变量表,表中包含了函数的名字和函数的地址。DLL的结构可简单表示如下图所示。 10.1.2 DLL与EXE 在DLL被装入的时候,以及进程中创建线程的时候,Windows都会以不同的参数调用入口点函数,然后该函数进行某些初始化工作后返回,DLL的执行就停止了。Windows并不为DLL创建单独的进程空间,而是将其装入共享地址,然后将其映射到不同的进程供进程调用,从而达到代码共享的目的。 DLL是一个相对独立的应用程序,它有自己的模块句柄和模块资源,多个应用程序可以同时使用一个DLL模块。不管有多少进程访问DLL,同一个DLL在内存中仅仅只有一份。 EXE是DLL所提供服务的使用者,调用DLL中的输出的函数和变量,每一个EXE在运行的时候,Windows均为它创建单独的进程环境,包括进程地址空间,EXE就在它的地址空间中运行,对别的进程是不透明的,因此也就无法为别的进程调用,因此在许多情况下只能使用DLL来实现某些功能。 用户可能在应用程序中基于如下要求创建和使用DLL: 10.1.2 DLL与EXE 在不用的可执行文件(EXE)之间共享公共的程序。 在设计应用程序时,将其拆分为各个相互独立的功能部件,便于以后对这些功能部件进行独立的升级操作。 使资源数据独立于可执行的应用程序之外,且又能够方便快捷地访问它。其典型使用例子就是为一个应用程序设计各种语言的
显示全部