2011-10-09 94 views
3

当我想调用一些Windows函数,如MessageBox时,我可以从user32.dll中导入它并调用(使用LoadLibrary和GetProcAddress)。但是也有一个Visual C++使用的静态库,所以我不需要手动加载DLL和函数。他们如何工作?它们是否包含每次调用函数时调用LoadLibrary/GetProcAddress的包装?静态库

回答

6

您所指的“静态库”实际上是import library。这种类型的库包含告诉链接器每个函数实际存在于哪个库中的记录,并且本身不包含任何代码。链接器在可执行文件中创建导入记录,加载程序在加载时解析该导入记录。这将修复运行时使用的地址,因此您的代码不需要明确地调用LoadLibraryGetProcAddress

1

不,他们只是允许你使用静态链接与DLL。可执行文件包含其他DLL文件所需的函数列表,因此加载可执行文件时,加载程序将解析此列表并使用LoadLibraryGetProcAddress解析每个函数,将结果保存到静态表(IAT,导入的地址表) 。这只做一次。还有DLL的“延迟加载”的概念,它只会在函数第一次调用时才解析地址,但很少使用。

这样,DLL的lib文件只包含构建该列表所需的信息(导出函数的名称)。

+0

使用延迟加载库的一个示例是支持多个版本的DirectX并基于客户端计算机选择一个的项目。它将列出所有受支持版本的DLL作为延迟加载库,实际上只加载一个。 – IronMensan