Windows上的DLL搜索

18
在Linux上,我们有LIBRARY_PATHLD_LIBRARY_PATH环境变量用于程序搜索库。在Windows上是否有类似的东西?特别是在Windows 7上?
此外,我想了解DLL使用的最佳实践(放置位置、是否使用环境变量等),因为我希望像其他人一样在Windows上工作,而不是在解决问题上浪费时间。
4个回答

17

编辑:Bob 解释说,这个答案描述的是“备用搜索顺序”,而大多数应用程序看到的不是这样。全面的规则相当复杂。我不认为我能在这里总结它们。相反,请阅读Microsoft文档-https://learn.microsoft.com/zh-cn/windows/win32/dlls/dynamic-link-library-search-order

我的原始回答如下:

这篇MSDN文章解释了默认的搜索顺序。引用如下:

  1. 由lpFileName指定的目录。
  2. 系统目录。使用GetSystemDirectory函数获取此目录的路径。
  3. 16位系统目录。没有函数获取此目录的路径,但会被搜索。
  4. Windows目录。使用GetWindowsDirectory函数获取此目录的路径。
  5. 当前目录。
  6. 列在PATH环境变量中的目录。请注意,这不包括由App Paths注册表键指定的每个应用程序路径。在计算DLL搜索路径时,不使用App Paths键。

在(1)中,如果您针对DLL的存根库进行了静态链接,我认为“由lpFileName指定的目录”是进程exe的路径。


2
本答案描述了“备用搜索顺序”。大多数应用程序默认使用“标准搜索顺序”,该顺序首先搜索应用程序目录,当前工作目录是在系统目录之前还是之后搜索取决于SafeDllSearchMode。这不是最近的变化;当答案编写时(2011年),就已经是这种情况,并且仍然适用。参考链接 - Bob
很好的观点。我已经相应地更新了答案。为自己辩护,当我写下这个答案时,Windows XP仍然是最常见的版本,而且我没有接触到任何更新的东西。但是,我仍然应该指出我的回答范围。出于历史兴趣,这里有一个关于Windows版本流行度随时间变化的图表 https://gs.statcounter.com/windows-version-market-share/desktop/worldwide/#monthly-200901-202002 - Andrew Bainbridge
1
查看历史版本可以发现,标准搜索顺序和备用搜索顺序的区别纯粹取决于所使用的API调用(并且XP默认也使用标准搜索顺序,正如其名称所示)。唯一与早期(SP2之前)XP不同的是SafeDllSearchMode,它改变了当前目录位置的顺序,但同样不影响标准搜索顺序和备用搜索顺序。而SP2之前的XP已经非常古老且不安全,XP主要在SP2之后才开始流行。 - Bob
1
我的意思是,感谢您的更新,但除非我完全误读了文章,否则我认为这对XP也不正确。尽管我希望人们在2020年不再寻找XP答案,但最好还是准确无误。 - Bob
这些东西我已经想了9年了。当时我真的认为这个答案是正确的,但现在看来它从来就不是。感谢您的反馈。 - Andrew Bainbridge

2
请查看 LoadLibraryCreateProcess 函数的帮助文档。它们描述了用于定位动态链接库(DLL)的路径以及如何修改这些路径。

0

它首先查找 currentDir,然后是 WinDir 和 SystemDir,还有您的路径。


4
我不认为那是真的。当前目录在搜索列表中排名第5位。列表中的第一项是exe文件所在的文件夹,通常并非当前目录。 - Andrew Bainbridge
现在看起来好像是在系统文件夹中首先出现了。 - thang

0
根据@andrew在他的回答中提到的,用于在Windows上搜索DLL的文件夹顺序可能因配置而异。我认为在Windows上检查此顺序的最简单方法是使用Dependency Walker工具。打开工具后,在工具栏上按下“配置模块搜索顺序”按钮,您将看到如下窗口:

enter image description here

这个窗口显示了您机器上当前的搜索顺序。有趣的部分是,通过按下“展开”,您可以逐个查看搜索路径中的整个文件夹。如果需要,您还可以更改顺序,以用于加载特定模块。


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