文档详情

MFC中引用DLL.pdf

发布:2017-06-14约9.91千字共4页下载文档
文本预览下载声明
MFC 中引用DLL DLL 的背景知识 静态链接和动态链接 当前链接的目标代码(.obj)如果引用了一个函数却没有定义它,链接 程序可能通过两种途径来解决这种从外部对该函数的引用: ( .lib) 静态链接 链接程序搜索一个或者多个库文件 标准库 ,直到在某个库中找到了含有所引 用函数的对象模块,然后链接程序把这个对象模块拷贝到结果可执行文件(.exe) 中。链接 序维护对该函数的所有引用,使它们指向该程序中现在含有该函数拷贝的地方。 ( .lib) 动态链接 链接程序也是搜索一个或者多个库文件 输入库 ,当在某个库中找到了所引用 函数的输入记录时,便把输入记录拷贝到结果可执行文件中,产生一次对该函数的动态链 接。这里,输入记录不包含函数的代码或者数据,而是指定一个包含该函数代码以及该函数 的顺序号或函数名的动态链接库。当程序运行时,Windows 装入程序,并寻找文件中出现的 任意动态链接。对于每个动态链接,Windows 装入指定的 DLL 并且把它映射到调用进程的 虚拟地址空间(如果没有映射的话)。因此,调用和目标函数之间的实际链接不是在链接应 用程序时一次完成的(静态),相反,是运行该程序时由 Windows 完成的(动态)。这种 动态链接称为加载时动态链接。还有一种动态链接方式下面会谈到。 动态链接的方法 链接动态链接库里的函数的方法如下: 加载时动态链接(Load_time dynamic linking) 如上所述。Windows 搜索要装入的 DLL 时,按 以下顺序:应用程序所在目录→当前目录→Windows SYSTEM 目录→Windows 目录 →PATH 环境变量指定的路径。 运行时动态链接(Run_time dynamic linking) 程序员使用 LoadLibrary 把 DLL 装入内存并且映 射 DLL 到调用进程的虚拟地址空间(如果已经作了映射,则增加DLL 的引用计数)。首先, LoadLibrary 搜索 DLL ,搜索顺序如同加载时动态链接一样。然后,使用 GetProcessAddress 得到 DLL 中输出函数的地址,并调用它。最后,使用FreeLibrary 减少 DLL 的引用计数,当 0 DLL 引用计数为 时,把 模块从当前进程的虚拟空间移走。 (.lib) .lib COFF(Common object file format) COFF 输入库 : 输入库以 为扩展名,格式是 。 标准 .lib COFF dumpbin 库(静态链接库)的扩展名也是 。 格式的文件可以用 来查看。输入库包含 了DLL 中的输出函数或者输出数据的动态链接信息。当使用MFC 创建 DLL 程序时,会生 成输入库(.lib)和动态链接库(.dll) 。 输出文件(.exp) 输出文件以.exp 为扩展名,包含了输出的函数和数据的信息,链接程序使用 它来创建 DLL 动态链接库。 映像文件(.map) 映像文件以.map 为扩展名,包含了如下信息:模块名、时间戳、组列表(每 section::offset ( 一组包含了形式如 的起始地址,长度、组名、类名)、公共符号列表 形式如 section::offset flat address .obj ) 的地址,符号名,虚拟地址 ,定义符号的 文件 、入口点如 section::offset、fixup 列表。 lib.exe 工具 它可以用
显示全部
相似文档