当我想调用一些Windows函数时,比如MessageBox,我可以从user32.dll导入它并调用(使用LoadLibrary和GetProcAddress)。但是还有一个Visual C ++使用的静态库,所以我不需要手动加载DLL和函数。他们是如何工作的?它们是否包含每次调用函数时调用LoadLibrary / GetProcAddress的包装器?
答案 0 :(得分:6)
您所指的“静态库”实际上是import library。这种类型的库包含记录,这些记录告诉链接器每个函数实际存在哪个库,并且本身不包含任何代码。链接器在可执行文件中创建导入记录,加载程序在加载时解析。这会修复运行时使用的地址,因此您的代码无需显式调用LoadLibrary
和GetProcAddress
。
答案 1 :(得分:1)
不,它们只允许您使用DLL的静态链接。可执行文件包含其他DLL文件所需的函数列表,因此在加载可执行文件时,加载器会解析此列表并使用LoadLibrary
和GetProcAddress
解析每个函数,从而将结果保存为静态表(IAT,导入的地址表)。这只做一次。 DLL的“延迟加载”的概念,只有在第一次调用函数时才会解析地址,但很少使用它。
这样,DLL的lib文件只包含构建该列表所需的信息(导出函数的名称)。