MFC中引用DLL.pdf
文本预览下载声明
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 工具 它可以用
显示全部