延迟加载 DLL 和相关的 .lib 文件

4
我正在尝试在我的应用程序中延迟加载wintrust.dll和crypt32.dll(这些用于在DLL中执行数字签名/发布者检查)。我正在使用VS2008。在将这两个DLL添加为项目属性链接器部分中延迟加载属性的条目后,我仍然收到LNK4199警告,即未从DLL加载任何内容,并且LNK2019错误无法解析诸如WinVerifyTrust之类的符号。
将以下内容作为附加依赖项条目添加可以缓解此问题:crypt32.lib和wintrust.lib。现在我没有链接问题。但是,我想知道如何确保不将其链接到静态库?我不想链接到静态库,因为可能存在许可问题。我想动态加载安装在Windows中的DLL,并希望DelayLoad可以帮助我做到这一点,而无需采用LoadLibrary和GetProcAddress函数调用。
非常感谢您提供有关所有不同库用法/链接选项的任何信息!
谢谢。
4个回答

4
延迟加载并不意味着你不需要链接库文件。通常,DLLs会在应用程序启动时立即加载。延迟加载只是将此推迟到第一次调用该DLL中函数的时候。无论哪种方式,你都需要链接到库文件,以便链接器可以验证你正在调用的函数实际上存在于DLL中。
如果你不想链接库文件,唯一的出路就是使用LoadLibraryGetProcAddress

3

这些库没有静态的 .lib 文件。SDK 库始终是导入库而非静态的 .lib,因为相应的 Windows API 存在于 DLL 中。不需要担心这个问题。


很好,那正是我想知道的。你知道是否有任何文件可以证实这一点吗? - sohum
1
API函数所在的DLL文件在MSDN Library页面中有记录。您可以从https://dev59.com/w1HTa4cB1Zd3GeqPPCUQ#3936573获取确认。 - Hans Passant
那是一个 Rick Roll 的 SO 版本。 - John Dibling
@John:我不得不查一下,没错。谢谢你的梗。 - Hans Passant

2

一个可帮助您确定事物是否按照您的预期链接的工具是 DependecyWalker:http://www.dependencywalker.com/ - 特别是在延迟加载的情况下,它会用特殊符号标记它们。


很酷,这表明它连接到了 Crypt32.dll 和 Wintrust.dll。 - sohum

0

我不明白... 我已经提到过,我想使用DelayLoad来加载DLL,而不必使用LoadLibrary和GetProcAddress。 - sohum
这是我所知道的唯一一种在运行时加载DLL而不必链接到定义符号的某些库的方法。 - Joshua Rodgers
1
我猜我的更大的问题在于,当我这样做时,它本质上似乎是静态链接到那个库。这不是这种情况吗? - sohum
DLL的.lib文件实际上只是指定DLL中的地址和符号名称,以便链接器可以解析代码中的符号。 - Joshua Rodgers
从实际上来看,Joshua是正确的,静态导入.lib文件似乎只是地址和符号名称。但从LGPL的角度来看,仍然不清楚使用静态导入库进行隐式链接是否仍然有资格作为“动态链接”,或者如果在Visual Studio上使用LoadLibrary显式链接是唯一合法的使用LGPL组件的动态链接方式而无需发布所有目标文件。LGPL似乎是针对GCC编写的,而GCC可以直接链接到.so和(MinGW).dll文件,而无需涉及.lib文件。 - jrh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接