- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Win32环境下动态链接库(DLL)编程原理
比较大 应用程序都由很多模块组成,这些模块分别完成相对独立的功能,它们彼此协作来完成整个软件系统的工作。其中可能存在一些模块的功能较为 通用,在构造其它软件系统时仍会被使用。在构造软件系统时,如果将所有模块的 源代码都静态编译到整个应用程序EXE文件中,会产生一些问题:一个缺点是增加了应用程序的大小,它会占用更多的磁盘空间,程序运行时也会消耗较大的 内存空间,造成系统资源的浪费;另一个缺点是,在编写大的EXE程序时,在每次修改重建时都必须调整编译所有源代码,增加了编译过程的复杂性,也不利于阶段性的单元 测试。 Windows系统平台上提供了一种完全不同的较有效的编程和运行环境,你可以将独立的程序模块创建为较小的DLL( Dynamic Linkable Library)文件,并可对它们单独编译和测试。在运行时,只有当EXE程序确实要调用这些DLL模块的情况下,系统才会将它们装载到内存空间中。这种 方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。 Microsoft Windows自己就将一些主要的系统功能以DLL模块的形式实现。例如IE中的一些基本功能就是由DLL文件实现的,它可以被其它应用程序调用和集成。 一般来说,DLL是一种磁盘文件(通常带有DLL扩展名),它由全局数据、服务函数和资源组成,在运行时被系统加载到进程的虚拟空间中,成为调用进程的 一部分。如果与其它DLL之间没有冲突,该文件通常映射到进程虚拟空间的同一地址上。DLL模块中包含各种导出函数,用于向外界提供服务。Windows 在加载DLL模块时将进程函数调用与DLL文件的导出函数相匹配。 在Win32环境中,每个进程都复制了自己的读/写全局变量。如果想要与其它进程共享内存,必须使用内存映射文件或者声明一个共享数据段。DLL模块需要的堆栈内存都是从运行进程的堆栈中分配出来的。 DLL现在越来越容易编写。Win32已经大大简化了其编程模式,并有许多来自AppWizard和MFC类库的支持。 一、导出和导入函数的匹配 DLL文件中包含一个导出函数表。这些导出函数由它们的符号名和称为标识号的整数与外界联系起来。函数表中还包含了DLL中函数的地址。当应用程序加载 DLL模块时时,它并不知道调用函数的实际地址,但它知道函数的符号名和标识号。动态链接过程在加载的DLL模块时动态建立一个函数调用与函数地址的对应 表。如果重新编译和重建DLL文件,并不需要修改应用程序,除非你改变了导出函数的符号名和参数序列。 简单的DLL文件只为应用程序提供导出函数,比较复杂的DLL文件除了提供导出函数以外,还调用其它DLL文件中的函数。这样,一个特殊的DLL可以既有导入函数,又有导入函数。这并不是一个问题,因为动态链接过程可以处理交叉相关的情况。 在DLL代码中,必须像下面这样明确声明导出函数:__declspec(dllexport) int MyFunction(int n); 但也可以在模块定义(DEF)文件中列出导出函数,不过这样做常常引起更多的麻烦。在应用程序方面,要求像下面这样明确声明相应的输入函数:__declspec(dllimport) int MyFuncition(int n); 仅有导入和导出声明并不能使应用程序内部的函数调用链接到相应的DLL文件上。应用程序的项目必须为链接程序指定所需的输入库(LIB文件)。而且应用程序事实上必须至少包含一个对DLL函数的调用。 二、与DLL模块建立链接 应用程序导入函数与DLL文件中的导出函数进行链接有两种方式:隐式链接和显式链接。所谓的隐式链接是指在应用程序中不需指明DLL文件的实际存储路径,程序员不需关心DLL文件的实际装载。而显式链接与此相反。 采用隐式链接方式,程序员在建立一个DLL文件时,链接程序会自动生成一个与之对应的LIB导入文件。该文件包含了每一个DLL导出函数的符号名和可选 的标识号,但是并不含有实际的代码。LIB文件作为DLL的替代文件被编译到应用程序项目中。当程序员通过静态链接方式编译生成应用程序时,应用程序中的 调用函数与LIB文件中导出符号相匹配,这些符号或标识号进入到生成的EXE文件中。LIB文件中也包含了对应的DLL文件名(但不是完全的路径名),链 接程序将其存储在EXE文件内部。当应用程序运行过程中需要加载DLL文件时,Windows根据这些信息发现并加载DLL,然后通过符号名或标识号实现 对DLL函数的动态链接。 显式链接方式对于集成化的开发语言(例如VB)比较适合。有了显式
您可能关注的文档
- 北京师范大学附属教育集团LabVIEW访问MySQL数据库的一种简单方法.docx
- 北京师范大学附属教育集团Lenovo-V460-笔记本-拆机图-step-详解.docx
- 北京师范大学附属教育集团like--such-as和for-example的用方法区别.docx
- 北京师范大学附属教育集团Linux-AD采样多线程.docx
- 北京师范大学附属教育集团Linux常用命令实验报告.docx
- 北京师范大学附属教育集团Linux实验3.docx
- 北京师范大学附属教育集团linux系统安全加固规范.docx
- 北京师范大学附属教育集团l两票制票据查验、储存制度及流程.docx
- 北京师范大学附属教育集团Matlab常用工具箱及常用函数.docx
- 北京师范大学附属教育集团MATLAB程序演示烟花燃放过程.docx
- 北京师范大学附属教育集团Windows-7综合练习题.docx
- 北京师范大学附属教育集团word2010上机操作题(要求、素材、样张).docx
- 北京师范大学附属教育集团wv分布和模糊函数.docx
- 北京师范大学附属教育集团zxy2016年菏泽市中考语文试卷分析报告.docx
- 北京师范大学附属教育集团ZY-玻璃量器验收内部校准作业指导书.docx
- 北京师范大学附属教育集团ZZ031-2018年安徽省职业院校技能大赛中职组“数字影音后期制作技术”赛项规程.docx
- 北京师范大学附属教育集团癌症中美5年生存率对比.docx
- 北京师范大学附属教育集团爱国诚信友善--手抄报.docx
- 北京师范大学附属教育集团爱国奋斗、新时代知识分子使命学习体会.docx
- 北京师范大学附属教育集团爱心献给父母国旗下讲话稿.docx
最近下载
- 2025年泡沫铝行业研究报告及未来发展趋势预测.docx
- 智慧城市应急管理信息化平台建设方案(47页).pptx VIP
- 班主任基本功大赛育人故事一等奖:从“心”擦亮星星的光.docx VIP
- (高清版)-B-T 41932-2022 塑料 断裂韧性(GIC和KIC)的测定 线弹性断裂力学(LEFM)法.pdf VIP
- 上海牛津英语5B知识点汇总.docx VIP
- 华为交换机配置教程(从入门开始)-华为交换机详细教程.pdf VIP
- 机械创新设计第七章 仿生原理与创新设计 .ppt VIP
- 高等教育心理学课件.ppt VIP
- ISO 55013-2024 资产管理-数据资产管理指南(中文版-雷泽佳翻译-2024).docx
- 发改价格〔〕670建设工程监理与相关服务收费标准.doc VIP
文档评论(0)