《动态链接库PPT讲稿.ppt》由会员分享,可在线阅读,更多相关《动态链接库PPT讲稿.ppt(21页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、动态链接接库第1页,共21页,编辑于2022年,星期五11.1 DLL11.1 DLL概述概述动态链接库是建立在客户和服务器的概念基础上。函数动态链接库是建立在客户和服务器的概念基础上。函数和数据被封装在和数据被封装在DLL服务器上,可以由一个或多个客户导出服务器上,可以由一个或多个客户导出并且使用。并且使用。第2页,共21页,编辑于2022年,星期五11.1.1 11.1.1 动态库和静态库动态库和静态库动态库是运行时库,库函数和数据不复制到可执行文件动态库是运行时库,库函数和数据不复制到可执行文件中,而是创建两个文件:一个引入库和一个中,而是创建两个文件:一个引入库和一个 DLL DLL。
2、引入库包。引入库包含被含被DLLDLL导出的函数的名称和位置,导出的函数的名称和位置,DLLDLL包含实际的函数和数包含实际的函数和数据。使用给定的据。使用给定的DLLDLL的导出函数的应用程序链接到的导出函数的应用程序链接到DLLDLL上。其上。其链接方式也包含显示链接和隐式链接两种形式。由于链接方式也包含显示链接和隐式链接两种形式。由于DLLDLL包包含含DLLDLL的客户所需要的函数和数据,因此这种的客户所需要的函数和数据,因此这种DLLDLL必须和可执必须和可执行文件放在一起。行文件放在一起。静态库的函数和数据被编译成一个二进制文件。然后,静态库的函数和数据被编译成一个二进制文件。然后
3、,链接器从库中复制这些函数和数据并把它们和应用程序的其链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件。当应用程序链接一他模块组合起来创建最终的可执行文件。当应用程序链接一个静态库时,称为个静态库时,称为“静态链接静态链接”。这种形式的应用程序所需。这种形式的应用程序所需要的全部内容都从库函数中复制到可执行文件中。可执行文要的全部内容都从库函数中复制到可执行文件中。可执行文件的大小往往比较大,库本身不用一起发行。件的大小往往比较大,库本身不用一起发行。第3页,共21页,编辑于2022年,星期五11.1.2 11.1.2 加载加载DLLDLL加载加载DLL一
4、般有两种方法:显式和隐式。一般有两种方法:显式和隐式。DLL客户或者客户或者通过链接库通过链接库(DLL)的引入库,或者通过在客户的的引入库,或者通过在客户的.DEF文件中文件中的的IMPORT段列出段列出DLL的导出函数来隐式加载一个的导出函数来隐式加载一个DLL。隐。隐式加载是常用的式加载是常用的DLL加载方式。编写人员只需要简单的包含加载方式。编写人员只需要简单的包含所需的头文件,并链接所需的头文件,并链接DLL,就可以进行函数调用了。,就可以进行函数调用了。第4页,共21页,编辑于2022年,星期五11.2 Visual C+6.011.2 Visual C+6.0的常规的常规DLLD
5、LLVisual C+6.0定义了两种类型的定义了两种类型的DLL:常规:常规DLL和扩展和扩展DLL。常规。常规DLL用在导出的函数是用在导出的函数是C函数、函数、C+类或者类或者C+成员函数的时候。需要注意的是:成员函数的时候。需要注意的是:C+类不是类不是MFC类。如果类。如果DLL需要导出的是一个需要导出的是一个MFC类,就应该使用扩展类,就应该使用扩展DLL的编的编写方式。使用常规写方式。使用常规DLL的好处在于:的好处在于:客户端不一定非要是客户端不一定非要是MFC应用程序;应用程序;常规的常规的DLL可以在内部使用可以在内部使用C+类,只导出类,只导出C函数的包函数的包装器。对装
6、器。对C+类的修改不会影响他的应用程序和类的修改不会影响他的应用程序和DLL。第5页,共21页,编辑于2022年,星期五11.2.1 11.2.1 常规常规DLLDLL的内部的内部当使用当使用Visual C+的的AppWizard创建了一个常规的创建了一个常规的DLL时,打开源代码会发现一个非常熟悉的类:时,打开源代码会发现一个非常熟悉的类:CWinApp类。类。CWinApp类的对象也代表着这个类的对象也代表着这个DLL。这样,就可以像开。这样,就可以像开发发Win32应用程序一样开发和实现应用程序一样开发和实现DLL。CWinApp类的初始类的初始化通常发生在化通常发生在InitInst
7、ance()函数中,程序员可以取代函数中,程序员可以取代DLL的的CWinApp:InitInstance()函数,并提供全局初始化。函数,并提供全局初始化。第6页,共21页,编辑于2022年,星期五11.2.2 11.2.2 动态加载动态加载DLLDLL当程序被加载时,当程序被加载时,Windows自动加载应用程序隐式链接自动加载应用程序隐式链接的的DLL,但是经常需要动态加载,但是经常需要动态加载DLL。为了在运行时加载。为了在运行时加载DLL,应用程序可以调用,应用程序可以调用LoadLibrary函数。这个函数的原函数。这个函数的原型如下:型如下:HINSTANCE LoadLibra
8、ry(LPCTSTR lpLibFileName)1为函数缝编程为函数缝编程2多种语言的应用程序多种语言的应用程序3头文件或引入的库不可使用头文件或引入的库不可使用4从二进制文件中检索资源从二进制文件中检索资源第7页,共21页,编辑于2022年,星期五11.2.3 11.2.3 使用使用DLLDLL的全局的全局C+C+对象对象Win32 DLL被映射到主调进程的地址空间时,被映射到主调进程的地址空间时,DLL的激的激活会获得数据的一个刷新版本。一个活会获得数据的一个刷新版本。一个DLL需要管理的全局数需要管理的全局数据,需要专门进行定义。并且一个据,需要专门进行定义。并且一个DLL的多次激活共
9、享全局的多次激活共享全局数据并不困难。当定义全局数据时,需要使用数据并不困难。当定义全局数据时,需要使用#pragma指令指令命名一个数据段,在数据段内生成和初始化想要使用的全局命名一个数据段,在数据段内生成和初始化想要使用的全局变量。这样,应用程序就可以维护数据,而不必考虑变量。这样,应用程序就可以维护数据,而不必考虑DLL的的激活。当需要记录有多少客户被附加到一个激活。当需要记录有多少客户被附加到一个DLL类的时候,类的时候,全局数据就非常有用了。一般需要计数器的时候,就要使用全局数据就非常有用了。一般需要计数器的时候,就要使用这种方法,当每一个客户调用这种方法,当每一个客户调用DLL的时
10、候,就需要使全局的的时候,就需要使全局的计数器加计数器加1。第8页,共21页,编辑于2022年,星期五11.3 MFC11.3 MFC扩展扩展DLLDLL常规常规DLL典型用于非典型用于非MFC客户,而客户,而MFC扩展扩展DLL用于用于导出增强导出增强MFC的函数和类。的函数和类。第9页,共21页,编辑于2022年,星期五11.3.1 MFC11.3.1 MFC扩展扩展DLLDLL的内部的内部MFC扩展扩展DLL和常规和常规DLL,都可以用,都可以用AppWizard创建,可创建,可以用类似的方法建立,但是这两种以用类似的方法建立,但是这两种DLL之间还是有一些根本上之间还是有一些根本上的差
11、异的。的差异的。MFC扩展扩展DLL的任何客户必须是的任何客户必须是MFC应用程序;应用程序;MFC扩展扩展DLL不一定需要拥有一个不一定需要拥有一个CWinAPP派生类对象;派生类对象;常规的常规的DLL通过函数通过函数initInstance()和和ExitInstance()函数()函数来实现初始化和退出之前的数据处理;来实现初始化和退出之前的数据处理;MFC的扩展的扩展DLL引入了一个新的类引入了一个新的类CDynLinkLibrary类,类,以允许以允许CRuntimeClass类或资源的导出。类或资源的导出。第10页,共21页,编辑于2022年,星期五11.3.2 11.3.2 扩
12、展扩展 DLL DLL的导出类的导出类MFC扩展扩展DLL通常在产生对导出基于通常在产生对导出基于MFC的类的需求时的类的需求时被使用。类及其函数以两种方式被导出,具体导出形式取决被使用。类及其函数以两种方式被导出,具体导出形式取决于:是导出整个类,还是导出类的成员函数的一个子集。前于:是导出整个类,还是导出类的成员函数的一个子集。前面,为了从常规的面,为了从常规的DLL导出函数,通常使用导出函数,通常使用.DEF文件。文件。MFC扩展导出类简化了这一工作,当需要导出整个类时,可扩展导出类简化了这一工作,当需要导出整个类时,可以利用宏以利用宏AFX_EXT_CLASS用在类声明中。用在类声明中
13、。第11页,共21页,编辑于2022年,星期五11.3.3 AFX_EXT_CLASS11.3.3 AFX_EXT_CLASSAFX_EXT_CLASS宏可用于导出整个类或部分类。当头宏可用于导出整个类或部分类。当头文件中包含有文件中包含有DLL正在导出的类的声明时,一旦客户应用程正在导出的类的声明时,一旦客户应用程序包含了这个头文件,就可以实现导出该类及其成员。序包含了这个头文件,就可以实现导出该类及其成员。AFX_EXT_CLASS宏可以实现从一个宏可以实现从一个DLL中导出整个类或中导出整个类或部分类。如果程序需要使用嵌套的部分类。如果程序需要使用嵌套的MFC扩展扩展DLL,就会出,就会
14、出现其他的问题了。这时候就不需要使用现其他的问题了。这时候就不需要使用AFX_EXT_CLASS宏了,需要在嵌套的宏了,需要在嵌套的 DLL中重新定义一个宏。中重新定义一个宏。第12页,共21页,编辑于2022年,星期五11.3.4 11.3.4 导出资源导出资源所谓导出资源就是把所谓导出资源就是把DLL中的资源导出。如果在一个中的资源导出。如果在一个MFC应用程序中的代码请求应用程序中的代码请求MFC加载一个自身的资源,那加载一个自身的资源,那么么MFC首先从当前模块中加载所请求的资源。首先从当前模块中加载所请求的资源。MFC通过调通过调用用AfxGetResourceHandle()函数定
15、位该模块的资源。如果被函数定位该模块的资源。如果被请求的资源没有找到,请求的资源没有找到,MFC会在应用程序的会在应用程序的CDynLinkLibrary对象链接列表中挨个查找,来定位这个资对象链接列表中挨个查找,来定位这个资源。这就需要使用函数源。这就需要使用函数AfxGetResourceHandle()指定模块()指定模块的的HINSTANCE。第13页,共21页,编辑于2022年,星期五11.3.5 DLL11.3.5 DLL中封装文档和视图中封装文档和视图现在是基于组件的软件开发时代,现在是基于组件的软件开发时代,MFC扩展扩展DLL可以把文档可以把文档/视图支持放入动态链接库中。例
16、:如果要实现一个功能,例如视图支持放入动态链接库中。例:如果要实现一个功能,例如要在一个文档要在一个文档/视图结构中支持某类型的图片显示。当很多应用视图结构中支持某类型的图片显示。当很多应用程序都需要这个功能的时候,就可以把这个文档程序都需要这个功能的时候,就可以把这个文档/视图结构作为视图结构作为一个功能封装在相应的一个功能封装在相应的DLL中。这样,只要需要显示这个类型的中。这样,只要需要显示这个类型的图片,只要链接这个图片,只要链接这个DLL就可以了。就可以了。第14页,共21页,编辑于2022年,星期五11.4 DLL11.4 DLL的创建和访问的创建和访问本节讲述如何创建本节讲述如何
17、创建DLL,及如何实现对,及如何实现对DLL的访问。分的访问。分别讲述创建别讲述创建MFC DLL和和Win32 DLL,以及隐含方式链接和,以及隐含方式链接和显示方式链接。显示方式链接。第15页,共21页,编辑于2022年,星期五11.4.1 11.4.1 创建创建MFC DLLMFC DLL创建一个创建一个MFC DLL,可以利用,可以利用Visual C+的的AppWizard来实现。来实现。第16页,共21页,编辑于2022年,星期五11.4.2 11.4.2 创建创建Win32 DLLWin32 DLL下面讲解创建下面讲解创建Win32 DLL的步骤。的步骤。第17页,共21页,编辑
18、于2022年,星期五11.4.3 11.4.3 隐含方式链接隐含方式链接要实现对要实现对DLL的隐含方式链接,应用程序需要从的隐含方式链接,应用程序需要从DLL的的提供者处获得以下文件;提供者处获得以下文件;一个包含有关输出函数和一个包含有关输出函数和/或输出类声明的头文件;或输出类声明的头文件;DLL的导入库(的导入库(.Lib),导入库是在编译链接),导入库是在编译链接DLL的时的时候创建的;候创建的;动态链接库动态链接库(.DLL文件文件)应用程序需要在访问应用程序需要在访问DLL的程序中包含的程序中包含DLL输出函数或输出函数或类声明的头文件。另外,应用程序对类声明的头文件。另外,应用
19、程序对DLL函数或者类的使用函数或者类的使用就像使用任何其它普通的函数和类一样。就像使用任何其它普通的函数和类一样。第18页,共21页,编辑于2022年,星期五11.4.4 11.4.4 显示方式链接显示方式链接显示方式链接要求应用程序以函数的形式实时地调入显示方式链接要求应用程序以函数的形式实时地调入DLL。要达到显示链接要达到显示链接DLL,应用程序要做到以下几点:,应用程序要做到以下几点:调用调用LoadLibrary函数以便调入函数以便调入DLL,并获得,并获得DLL模块的句模块的句柄;柄;调用调用GetProcAddress函数来获取应用程序希望访问的函数来获取应用程序希望访问的DL
20、L函函数的入口指针。因为应用程序通过指针访问数的入口指针。因为应用程序通过指针访问DLL函数,所以在链函数,所以在链接应用程序时不需要链接接应用程序时不需要链接DLL的控制权;的控制权;通过通过DLL函数指针访问函数指针访问DLL函数;函数;使用使用DLL结束以后,调用结束以后,调用FreeLibrary函数释放应用程序对函数释放应用程序对DLL的控制权。的控制权。第19页,共21页,编辑于2022年,星期五11.5 11.5 动态链接库的例子动态链接库的例子为了说明动态链接库的创建、访问和使用,在本小节将为了说明动态链接库的创建、访问和使用,在本小节将给出一个简单的例子,向读者展示动态链接库
21、的使用方法。给出一个简单的例子,向读者展示动态链接库的使用方法。第20页,共21页,编辑于2022年,星期五11.6 11.6 小结小结本章详细地讲解了动态链接库的基础知识,讲述了动态本章详细地讲解了动态链接库的基础知识,讲述了动态链接库的功能函数和类的导出,给出了一个详细的例题,有链接库的功能函数和类的导出,给出了一个详细的例题,有助于读者理解和学习。针对这个例题,给出了关键文件的源助于读者理解和学习。针对这个例题,给出了关键文件的源代码清单,方便查阅。本章的重点是学会创建和使用代码清单,方便查阅。本章的重点是学会创建和使用DLL。下一章重点讲述动态数据交换和邮槽。下一章重点讲述动态数据交换和邮槽。第21页,共21页,编辑于2022年,星期五