- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
windows核心编程-动态链接库
Windows核心编程 许红星 Email:hxxu@ynu.edu.cn 云南大学软件学院 动态链接库 它们扩展了应用程序的特性。 它们可以用许多种编程语言来编写。 它们简化了软件项目的管理。 它们有助于节省内存。 它们有助于资源的共享。 它们有助于应用程序的本地化。 它们有助于解决平台差异。 它们可以用于一些特殊的目的。 创建 创建D L L常常比创建应用程序更容易,因为D L L往往包含一组应用程序可以使用的自主函数。在D L L中通常没有用来处理消息循环或创建窗口的支持代码。D L L只是一组源代码模块,每个模块包含了应用程序(可执行文件)或另一个D L L将要调用的一组函数。当所有源代码文件编译后,它们就像应用程序的可执行文件那样被链接程序所链接。但是,对于一个D L L来说,你必须设定该连链程序的/ D L L开关。这个开关使得链接程序能够向产生的D L L文件映像发出稍有不同的信息,这样,操作系统加载程序就能将该文件映像视为一个D L L而不是应用程序。 内存管理 内存管理 创建 若要创建D L L模块,必须执行下列操作步骤: 1) 首先必须创建一个头文件,它包含你想要从D L L输出的函数原型、结构和符号。D L L的所有源代码模块均包含该头文件,以帮助创建D L L。后面将会看到,当创建需要使用D L L中包含的函数和变量的可执行模块(或多个模块)时,也需要这个头文件。 2) 要创建一个C / C + +源代码模块(或多个模块),用于实现你想要在D L L模块中实现的函数和变量。由于这些源代码模块在创建可执行模块时是不必要的,因此创建D L L的公司能够保护公司的秘密 创建 3) 创建D L L模块,将使编译器对每个源代码模块进行处理,产生一个. o b j模块(每个源代码模块有一个. o b j模块)。 4) 当所有的. o b j模块创建完成后,链接程序将所有. o b j模块的内容组合在一起,产生一个D L L映象文件。该映像文件(即模块)包含了用于D L L的所有二进制代码和全局/静态数据变量。为了执行这个可执行模块,该文件是必不可少的。 5) 如果链接程序发现D L L的源代码模块至少输出了一个函数或变量,那么链接程序也生成一个. l i b文件。这个. l i b文件很小,因为它不包含任何函数或变量。它只是列出所有已输出函数和变量的符号名。为了创建可执行模块,该文件是必不可少的。 一旦创建了D L L模块,就可以创建可执行模块。其创建步骤是: 6) 在引用函数、变量、数据、结构或符号的所有源代码模块中,必须包含D L L开发人员创建的头文件。 7) 要创建一个C / C + +源代码模块(或多个模块),用于实现你想要在可执行模块中实现的函数和变量。当然该代码可以引用D L L头文件中定义的函数和变量。 创建 8) 创建可执行模块,将使编译器对每个源代码模块进行处理,生成一个. o b j模块(每个源 代码模块有一个. o b j模块)。 9) 当所有. o b j模块创建完成后,链接程序便将所有的. o b j模块的内容组合起来,生成一个可执行的映像文件。该映像文件(或模块)包含了可执行文件的所有二进制代码和全局/静态变量。 该可执行模块还包含一个输入节,列出可执行文件需要的所有D L L模块名(关于各个节的详细说明,参见第1 7章)。此外,对于列出的每个D L L名字,该节指明了可执行模块的二进制代码引用了哪些函数和变量符号。下面你会看到操作系统的加载程序将对该输入节进行分析。 一旦D L L和可执行模块创建完成,一个进程就可以执行。当试图运行可执行模块时,操作系统的加载程序将执行下面的操作步骤: 10) 加载程序为新进程创建一个虚拟地址空间。可执行模块被映射到新进程的地址空间。加载程序对可执行模块的输入节进行分析。对于该节中列出的每个D L L名字,加载程序要找出用户系统上的D L L模块,再将该D L L映射到进程的地址空间。注意,由于D L L模块可以从另一个D L L模块输入函数和变量,因此D L L模块可以拥有它自己的输入节。若要对进程进行全面的初始化,加载程序要分析每个模块的输入节,并将所有需要的D L L模块映射到进程的地址空间。 导出文件 当创建D L L模块时,首先应该建立一个头文件,该文件包含了你想要输出的变量(类型和名字)和函数(原型和名字)。 输入 当输入一个符号时,不必使用关键字- -d e c l s p e c ( d l l i m p o r t ),只要使用标准的C关键字e x t e r n即可。但是,如果编译器预先知道你引用的符号将从一个D L L的. l i b文件输入,那么编译器就能够生成运行效率稍高的代码。因此建议你尽量将- - d e c
文档评论(0)