windows上的DLL搜索

windows上的DLL搜索,dll,windows-7,environment-variables,Dll,Windows 7,Environment Variables,在linux上,我们有LIBRARY\u PATH和LD\u LIBRARY\u PATH环境变量,以便程序搜索库。我们在windows上有类似的东西吗?尤其是Windows7 此外,我还想知道DLL使用的最佳实践(将它们放在哪里,是否使用环境,等等),因为我希望像所有人一样在windows上工作,而不是在解决方法上拖拖拉拉:)请查看和函数的帮助。这些描述了用于定位DLL的路径,以及如何修改它们。它首先在currentDir上查找,然后在路径中查找WinDir和SystemDir编辑:正如Bob

在linux上,我们有
LIBRARY\u PATH
LD\u LIBRARY\u PATH
环境变量,以便程序搜索库。我们在windows上有类似的东西吗?尤其是Windows7


此外,我还想知道DLL使用的最佳实践(将它们放在哪里,是否使用环境,等等),因为我希望像所有人一样在windows上工作,而不是在解决方法上拖拖拉拉:)

请查看和函数的帮助。这些描述了用于定位DLL的路径,以及如何修改它们。

它首先在currentDir上查找,然后在路径中查找WinDir和SystemDir

编辑:正如Bob所解释的,此答案描述了备用搜索顺序,这不是大多数应用程序会看到的。完整的规则相当复杂。我想我不能在这里总结它们。相反,请阅读Microsoft文档-

我最初的回答是:

解释默认的搜索顺序。我引述:

  • lpFileName指定的目录
  • 系统目录。使用GetSystemDirectory函数获取此目录的路径
  • 16位系统目录。没有获取此目录路径的函数,但会对其进行搜索
  • Windows目录。使用GetWindowsDirectory函数获取此目录的路径
  • 当前目录
  • PATH环境变量中列出的目录。请注意,这不包括应用程序路径注册表项指定的每个应用程序路径。计算DLL搜索路径时不使用应用路径键

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

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


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

    我认为这不是真的。当前目录在搜索列表中排名第五。列表中的第一件事是找到exe的文件夹,该文件夹通常不是当前目录。现在它看起来像是在系统文件夹中。此答案描述了备用搜索顺序。大多数应用程序默认使用标准搜索顺序,首先搜索应用程序目录,并且当前工作目录是在系统目录之前还是之后搜索取决于
    SafeDllSearchMode
    。这不是最近的变化;答案写出来的时候就是这样的,说得好。我已经相应地更新了答案。为我辩护,在我写答案时,Windows XP仍然是最常见的版本,而且我无法访问任何更新的版本。不过,我仍然应该指出我的答案的范围。出于历史兴趣,这里有一个Windows版本受欢迎程度随时间变化的图表,从名称上看,标准和备用搜索顺序之间的区别完全取决于所使用的API调用(XP也默认使用标准,顾名思义)。与早期(SP2之前)XP的唯一区别是SafeDllSearchMode,它改变了当前目录位置的顺序,但同样不影响标准与备用目录。SP2之前的XP很古老,甚至更不安全——XP在SP2之后大受欢迎。我的意思是,谢谢你的更新——但除非我完全误读了这篇文章,否则我认为这对XP也不正确。虽然我希望人们不要在2020年寻找XP的答案,但最好还是要准确。我已经9年没有考虑过这个问题了。我当时真的认为这个答案是正确的,但似乎从来都不是。谢谢你的反馈。