【问题标题】:DLL search on windowsWindows 上的 DLL 搜索
【发布时间】:2010-03-17 14:55:11
【问题描述】:

在 linux 上,我们有 LIBRARY_PATHLD_LIBRARY_PATH 环境变量,以便程序搜索库。我们在 Windows 上有类似的东西吗?特别是Windows 7?

另外,我想知道 DLL 使用的最佳实践(将它们放在哪里,是否使用环境等),因为我想像每个人一样在 Windows 上工作,而不是在变通方法上懒惰:)

【问题讨论】:

    标签: dll windows-7 environment-variables


    【解决方案1】:

    编辑:正如 Bob 所解释的,此答案描述了 备用搜索顺序,这不是大多数应用程序所看到的。完整的规则非常复杂。我不认为我可以在这里总结它们。相反,请阅读 Microsoft 文档 - https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order

    我原来的回答是:

    This MSDN article 解释了默认搜索顺序。我引用:

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

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

    【讨论】:

    • 这个答案描述了备用搜索顺序。大多数应用程序会默认使用标准搜索顺序,它首先搜索应用程序目录,而当前工作目录是在系统目录之前还是之后搜索取决于SafeDllSearchMode。这不是最近的变化;写答案时back in 2011still applies就是这种情况。
    • 公平点。我已经相应地更新了答案。在我的辩护中,在我写答案时,Windows XP 仍然是最常见的版本,我无法访问任何更新的版本。但是,我仍然应该指出我的答案的范围。出于历史兴趣,这里是 Windows 版本流行度随时间变化的图表gs.statcounter.com/windows-version-market-share/desktop/…
    • at the historical version,标准和备用搜索顺序之间的区别完全取决于所使用的API调用(顾名思义,XP默认也使用标准)。 唯一 与早期(SP2 之前)XP 的区别是 SafeDllSearchMode,它改变了当前目录位置的顺序,但同样不影响标准与备用。 SP2 之前的 XP 是古老的,甚至更加不安全 - XP 大多在 SP2 之后流行。
    • 我的意思是,感谢更新 - 但除非我完全误读了这篇文章,否则我认为这对于 XP 也不正确。尽管我希望人们不要在 2020 年寻找 XP 的答案,但最好还是准确一点。
    • 我已经 9 年没有想到这些东西了。我当时真的认为这个答案是正确的,但似乎从来都不是。感谢您的反馈。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我认为这不是真的。当前目录在搜索列表中排名第 5。列表中的第一件事是找到 exe 的文件夹,通常不是当前目录。
      • 看起来它现在首先出现在系统文件夹中
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2011-04-09
        • 1970-01-01
        • 1970-01-01
        • 2011-01-20
        • 1970-01-01
        • 1970-01-01
        • 2011-03-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多