【问题标题】:Dll dependency and search orderdll依赖和搜索顺序
【发布时间】:2026-02-17 21:00:01
【问题描述】:

我有一个依赖于 B.DLL 的 A.DLL,因此适用于应用程序的 DLL 搜索顺序也适用于 DLL,我的意思是当 A.DLL 加载时,它如何搜索 B.DLL ?如果 DLL 搜索顺序不适用于 DLL,我应该将 B.DLL 保存在哪里?我应该将它保存在 A.DLL 所在的当前目录中还是应该使用表单环境路径

注意:我不能把B.DLL是System32

欢迎提出任何建议。

【问题讨论】:

  • 应用程序的搜索规则,始终首先搜索包含EXE的目录。显然是存储 A.dll 和 B.dll 的好地方,绝不会是 DLL Hell 问题。
  • 感谢汉斯的回复。 DLL 在包含 EXE 的目录中不存在,实际上这个 A.DLL 是一个隐式链接 B.DLL 的 COM Dll。我可以将 B.DLL 放在 A.DLL 所在的同一目录中吗?我还没有开始B.DLL的开发,在我开始之前我有这些疑问所以想澄清一下
  • 您当然应该在问题中提及这一点。一个很简单的小技巧就可以解决,创建一个空的app.exe.local file

标签: c++ windows winapi dll


【解决方案1】:

同时适用于 exe 和 dll 的搜索顺序:https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order#standard-search-order-for-desktop-applications。无论安全模式如何,第一个始终是“加载应用程序的目录”。在dll方面,根据我通过Process Monitor的发现,这取决于dll是静态链接的还是通过LoadLibrary动态加载的。静态链接是dll目录,动态加载是exe目录。

例如,当C:\App.exe 加载D:\A.dll 时,这取决于您的示例中的B.dll,如果静态链接,Windows 会在D:\ 中搜索B.dll,如果加载有LoadLibrary,则搜索C:\。如果在那里没有找到B.dll,则继续搜索其他目录,例如 System32。

搜索顺序的下一行是“当前目录”。许多加载外部模块的应用程序可能有SetDllDirectory("") 来删除搜索中的当前目录以便avoid dll preloading vulnerability

【讨论】: