我认为隐式链接会在应用程序启动时立即加载 DLL,因为它也称为“加载时动态链接”。但我从这里的链接中发现了下面一些奇怪的解释(https://msdn.microsoft.com/en-us/library/253b8k2c(VS.80).aspx).
隐式链接
与程序代码的其余部分一样,DLL 代码也被映射到地址
进程启动并加载时的进程空间
仅在需要时才记忆。因此,PRELOAD 和 LOADONCALL 代码
.def 文件使用的属性来控制以前版本中的加载
Windows 不再具有意义。
显式链接
隐式链接到许多 DLL 的应用程序可能会很慢
启动,因为 Windows 在应用程序加载时加载所有 DLL。
为了提高启动性能,应用程序可以隐式链接到
那些加载后立即需要并等待显式调用的 DLL
需要时链接到其他 DLL。
以及来自此处的隐式链接的另一种解释(https://msdn.microsoft.com/en-us/library/151kt790.aspx).
隐式链接
Visual C++ 链接器现在支持 DLL 的延迟加载。这
使您无需使用 Windows SDK 函数 LoadLibrary
和GetProcAddress实现DLL延迟加载。
在 Visual C++ 6.0 之前,在运行时加载 DLL 的唯一方法是通过
使用 LoadLibrary 和 GetProcAddress;操作系统将加载
加载可执行文件或使用它的 DLL 时的 DLL。
从 Visual C++ 6.0 开始,当静态链接 DLL 时,
链接器提供延迟加载 DLL 直到程序调用的选项
该 DLL 中的函数。
应用程序可以使用/DELAYLOAD(延迟加载
导入)带有辅助函数的链接器选项(默认实现
由 Visual C++ 提供)。辅助函数将在运行时加载 DLL
打电话的时间加载库 and 获取进程地址为你。
我真的很困惑,不知道如何理解这些。
1.隐式链接是在启动时加载DLL还是仅在调用DLL中的函数时加载?
2. 这意味着两者最终是相似的,因为 LoadLibrary() 是在后台调用的?
@remy-lebeau 在他的评论中提供了很好的解释。我将尝试在这里详细说明作为答案。
隐式和显式dll加载之间的区别解释here。
简而言之:
- In 显式加载,应用程序通过显式调用 LoadLibrary 来加载 dll。
- In 隐式加载,应用程序在编译时指定dll,Windows加载程序在运行时加载它。
隐式加载有很多优点,但它会减慢应用程序加载时间,因为所有 dll 都会在此阶段加载。
为了解决这个问题,微软支持延迟加载的DLL,这是一个隐式加载类型.
通过使用它,您可以享受隐式加载的所有好处,但只有当您的应用程序调用其函数之一时,DLL 才会被加载。
对于您的问题:
- 在隐式加载中,如果您没有将其指定为延迟加载,则 dll 将在应用程序启动时加载。如果您这样做了,它将在第一次使用时加载。
- 是的。在所有情况下,dll 都会被加载并映射到应用程序内存。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)