【问题标题】:Customize DLL search directory programmatically以编程方式自定义 DLL 搜索目录
【发布时间】:2014-04-03 23:16:36
【问题描述】:

我正在用 C++ 编写一个 DLL。我的 DLL 将与第三方软件一起运行。它加载另一个 DLL(让我们称之为 LDLL),这个 LDLL 使用 openssl。

但每当我的 DLL 尝试加载我的 LDLL 时,它都会返回错误代码 126。

我使用dependency walker 运行我的 LDLL,它显示 openssl dll(ssleay.dll 和 libeay.dll)丢失。它正在一些standard folders中搜索这些。

是否有任何方式以编程方式将我自己的搜索路径包含在 LDLL 中,以在我自己的搜索路径中加载 openssl DLL?

【问题讨论】:

    标签: c++ dll


    【解决方案1】:

    来自the LoadLibrary documentation

    可以使用the SetDllDirectory function 更改搜索路径。建议使用此解决方案,而不是使用 SetCurrentDirectory 或硬编码 DLL 的完整路径。

    但要小心:

    每次调用SetDllDirectory 函数时,它都会替换上一次SetDllDirectory 调用中指定的目录。要指定多个目录,请使用AddDllDirectory 函数并调用LoadLibraryExLOAD_LIBRARY_SEARCH_USER_DIRS

    另一种方法是使用这些库的延迟加载,并在使用它们的函数之前使用LoadLibraryLoadLibraryEx 显式加载它们。

    【讨论】:

    • 谢谢,您能否添加更多细节 - 文档声明“将目录添加到用于定位应用程序 DLL 的搜索路径。”但它没有说明要添加的位置(在搜索路径的末尾或开头)。
    • @Mohan:实际上,它确实说“在调用SetDllDirectory 之后,标准的DLL 搜索路径是:...”。它既不是开头也不是结尾。
    【解决方案2】:

    “Windows DLL 搜索路径”的简单 google 为我们带来 here,我引用:

    对于隐式和显式链接,Windows 首先搜索“已知 DLL”,例如 Kernel32.dll 和 User32.dll。然后 Windows 按以下顺序搜索 DLL:

    1. 当前进程的可执行模块所在目录。

    2. 当前目录。

    3. Windows 系统目录。 GetSystemDirectory 函数检索此目录的路径。

    4. Windows 目录。 GetWindowsDirectory 函数检索此目录的路径。

    5. PATH 环境变量中列出的目录。

    注意 未使用 LIBPATH 环境变量。

    【讨论】:

    • 感谢谷歌搜索!我的问题是具体的 - 有没有办法以编程方式修改它,我重新引用“有没有办法修改这个搜索路径以包含我的 DLL 所在的当前目录?”我的 DLL 可能与这 5 个目录不同。让我换个说法。
    • 我已经找到了这个,甚至通过进程监视器列出了特定的目录 - technet.microsoft.com/en-us/sysinternals/bb896645
    猜你喜欢
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-21
    • 2012-12-02
    • 1970-01-01
    • 2017-06-19
    • 2010-10-01
    相关资源
    最近更新 更多