版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、动态链接库第1页,共21页,2022年,5月20日,15点19分,星期一11.1 DLL概述动态链接库是建立在客户和服务器的概念基础上。函数和数据被封装在DLL服务器上,可以由一个或多个客户导出并且使用。第2页,共21页,2022年,5月20日,15点19分,星期一11.1.1 动态库和静态库动态库是运行时库,库函数和数据不复制到可执行文件中,而是创建两个文件:一个引入库和一个 DLL。引入库包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据。使用给定的DLL的导出函数的应用程序链接到DLL上。其链接方式也包含显示链接和隐式链接两种形式。由于DLL包含DLL的客户所需要的函数和数据
2、,因此这种DLL必须和可执行文件放在一起。静态库的函数和数据被编译成一个二进制文件。然后,链接器从库中复制这些函数和数据并把它们和应用程序的其他模块组合起来创建最终的可执行文件。当应用程序链接一个静态库时,称为“静态链接”。这种形式的应用程序所需要的全部内容都从库函数中复制到可执行文件中。可执行文件的大小往往比较大,库本身不用一起发行。 第3页,共21页,2022年,5月20日,15点19分,星期一11.1.2 加载DLL加载DLL一般有两种方法:显式和隐式。DLL客户或者通过链接库(DLL)的引入库,或者通过在客户的.DEF文件中的IMPORT段列出DLL的导出函数来隐式加载一个DLL。隐式
3、加载是常用的DLL加载方式。编写人员只需要简单的包含所需的头文件,并链接DLL,就可以进行函数调用了。第4页,共21页,2022年,5月20日,15点19分,星期一11.2 Visual C+ 6.0的常规DLLVisual C+ 6.0定义了两种类型的DLL:常规DLL和扩展DLL。常规DLL用在导出的函数是C函数、C+类或者C+成员函数的时候。需要注意的是:C+类不是MFC类。如果DLL需要导出的是一个MFC类,就应该使用扩展DLL的编写方式。使用常规DLL的好处在于:客户端不一定非要是MFC应用程序;常规的DLL可以在内部使用C+类,只导出C函数的包装器。对C+类的修改不会影响他的应用程
4、序和DLL。第5页,共21页,2022年,5月20日,15点19分,星期一11.2.1 常规DLL的内部当使用Visual C+的AppWizard创建了一个常规的DLL时,打开源代码会发现一个非常熟悉的类:CWinApp类。CWinApp类的对象也代表着这个DLL。这样,就可以像开发Win32应用程序一样开发和实现DLL。CWinApp类的初始化通常发生在InitInstance()函数中,程序员可以取代DLL的CWinApp:InitInstance()函数,并提供全局初始化。第6页,共21页,2022年,5月20日,15点19分,星期一11.2.2 动态加载DLL当程序被加载时,Wind
5、ows自动加载应用程序隐式链接的DLL,但是经常需要动态加载DLL。为了在运行时加载DLL,应用程序可以调用LoadLibrary函数。这个函数的原型如下:HINSTANCE LoadLibrary(LPCTSTR lpLibFileName)1为函数缝编程2多种语言的应用程序3头文件或引入的库不可使用4从二进制文件中检索资源第7页,共21页,2022年,5月20日,15点19分,星期一11.2.3 使用DLL的全局C+对象Win32 DLL被映射到主调进程的地址空间时,DLL的激活会获得数据的一个刷新版本。一个DLL需要管理的全局数据,需要专门进行定义。并且一个DLL的多次激活共享全局数据并
6、不困难。当定义全局数据时,需要使用#pragma指令命名一个数据段,在数据段内生成和初始化想要使用的全局变量。这样,应用程序就可以维护数据,而不必考虑DLL的激活。当需要记录有多少客户被附加到一个DLL类的时候,全局数据就非常有用了。一般需要计数器的时候,就要使用这种方法,当每一个客户调用DLL的时候,就需要使全局的计数器加1。第8页,共21页,2022年,5月20日,15点19分,星期一11.3 MFC扩展DLL常规DLL典型用于非MFC客户,而MFC扩展DLL用于导出增强MFC的函数和类。第9页,共21页,2022年,5月20日,15点19分,星期一11.3.1 MFC扩展DLL的内部MF
7、C扩展DLL和常规DLL,都可以用AppWizard创建,可以用类似的方法建立,但是这两种DLL之间还是有一些根本上的差异的。MFC扩展DLL的任何客户必须是MFC应用程序;MFC扩展DLL不一定需要拥有一个CWinAPP派生类对象;常规的DLL通过函数initInstance()和ExitInstance()函数来实现初始化和退出之前的数据处理; MFC的扩展DLL引入了一个新的类CDynLinkLibrary类,以允许CRuntimeClass类或资源的导出。第10页,共21页,2022年,5月20日,15点19分,星期一11.3.2 扩展 DLL的导出类MFC扩展DLL通常在产生对导出基
8、于MFC的类的需求时被使用。类及其函数以两种方式被导出,具体导出形式取决于:是导出整个类,还是导出类的成员函数的一个子集。前面,为了从常规的DLL导出函数,通常使用.DEF文件。MFC扩展导出类简化了这一工作,当需要导出整个类时,可以利用宏AFX_EXT_CLASS用在类声明中。第11页,共21页,2022年,5月20日,15点19分,星期一11.3.3 AFX_EXT_CLASSAFX_EXT_CLASS宏可用于导出整个类或部分类。当头文件中包含有DLL正在导出的类的声明时,一旦客户应用程序包含了这个头文件,就可以实现导出该类及其成员。AFX_EXT_CLASS宏可以实现从一个DLL中导出整
9、个类或部分类。如果程序需要使用嵌套的MFC扩展DLL,就会出现其他的问题了。这时候就不需要使用AFX_EXT_CLASS宏了,需要在嵌套的 DLL中重新定义一个宏。第12页,共21页,2022年,5月20日,15点19分,星期一11.3.4 导出资源所谓导出资源就是把DLL中的资源导出。如果在一个MFC应用程序中的代码请求MFC加载一个自身的资源,那么MFC首先从当前模块中加载所请求的资源。MFC通过调用AfxGetResourceHandle()函数定位该模块的资源。如果被请求的资源没有找到,MFC会在应用程序的CDynLinkLibrary对象链接列表中挨个查找,来定位这个资源。这就需要使
10、用函数AfxGetResourceHandle()指定模块的HINSTANCE。第13页,共21页,2022年,5月20日,15点19分,星期一11.3.5 DLL中封装文档和视图现在是基于组件的软件开发时代,MFC扩展DLL可以把文档/视图支持放入动态链接库中。例:如果要实现一个功能,例如要在一个文档/视图结构中支持某类型的图片显示。当很多应用程序都需要这个功能的时候,就可以把这个文档/视图结构作为一个功能封装在相应的DLL中。这样,只要需要显示这个类型的图片,只要链接这个DLL就可以了。第14页,共21页,2022年,5月20日,15点19分,星期一11.4 DLL的创建和访问本节讲述如何
11、创建DLL,及如何实现对DLL的访问。分别讲述创建MFC DLL和Win32 DLL,以及隐含方式链接和显示方式链接。第15页,共21页,2022年,5月20日,15点19分,星期一11.4.1 创建MFC DLL创建一个MFC DLL,可以利用Visual C+的AppWizard来实现。第16页,共21页,2022年,5月20日,15点19分,星期一11.4.2 创建Win32 DLL下面讲解创建Win32 DLL的步骤。第17页,共21页,2022年,5月20日,15点19分,星期一11.4.3 隐含方式链接要实现对DLL的隐含方式链接,应用程序需要从DLL的提供者处获得以下文件;一个包
12、含有关输出函数和/或输出类声明的头文件;DLL的导入库(.Lib),导入库是在编译链接DLL的时候创建的;动态链接库(.DLL文件) 应用程序需要在访问DLL的程序中包含DLL输出函数或类声明的头文件。另外,应用程序对DLL函数或者类的使用就像使用任何其它普通的函数和类一样。第18页,共21页,2022年,5月20日,15点19分,星期一11.4.4 显示方式链接显示方式链接要求应用程序以函数的形式实时地调入DLL。要达到显示链接DLL,应用程序要做到以下几点:调用LoadLibrary函数以便调入DLL,并获得DLL模块的句柄;调用GetProcAddress函数来获取应用程序希望访问的DLL函数的入口指针。因为应用程序通过指针访问DLL函数,所以在链接应用程序时不需要链接DLL的控制权;通过DLL函数指针访问DLL函数;使用DLL结束以后,调用FreeLibrary函数释放应用程序对DLL的控制权。第19页,共21页,2022年,5月20日,15点19分,星期一11.5 动态链接库的例子为了说明动态链接库的创建、访问和使用,在本小节将给出一个简单的例子,向读者展示动态链
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 经营决策方案
- 期中(试题)-2024-2025学年人教PEP版(2024)英语三年级上册
- 军训军列调整方案
- 福建公务员面试模拟148
- 吉林公务员面试模拟96
- 江苏公共基础知识真题2007年B类
- 云南行政职业能力模拟43
- 上海公务员面试模拟9
- 第二章+第一节+幼儿感知觉的发展+1(教案)-《幼儿心理学》(人教版第二版)
- 陕西行政职业能力2010年09月
- 2024年社区工作者面试题库与答案
- 人工智能技术应用专业调研报告
- 2024发展对象培训班考试试题与答案
- GB/T 15967-20241∶500 1∶1 000 1∶2 000地形图数字航空摄影测量测图规范
- (正式版)HGT 22820-2024 化工安全仪表系统工程设计规范
- 《中华民族共同体概论》考试复习题库(含答案)
- NB-T 47013.15-2021 承压设备无损检测 第15部分:相控阵超声检测
- 信息安全风险评估记录表
- 科技促进经济发展探讨
- 大学综合英语第一册unit1(上海外语出版社)
- W5300控制器详细设计及使用说明文档
评论
0/150
提交评论