【问题标题】:Why does LoadLibrary succeed or fail depending on the current directory?为什么 LoadLibrary 会根据当前目录成功或失败?
【发布时间】:2014-09-17 17:35:35
【问题描述】:

我遇到了 LoadLibrary 的问题,这是我以前从未遇到过的问题,这是我第一次看到这个问题,我正在尝试在“C:\Program Files (x86) 中加载一个模块“nss3.dll” )\Mozilla Firefox\" 与 LoadLibrary,为了从中导入一些函数,但返回值为 0 失败,我尝试从 system32 文件夹硬编码一个 .dll,它工作正常,有什么想法吗?

编辑:我忘了提,解决这个问题的一种方法是调用 SetCurrentDirectory,然后在不指定 .dll 路径的情况下导入模块,但事实并非如此,我想知道为什么它会发生在我身上.

编辑:这里有一些 sn-p(可行):

var
  NSSModule: HModule;
begin
  SetCurrentDir('C:\Program Files (x86)\Mozilla Firefox');
  NSSModule := LoadLibrary('nss3.dll');

这个,不工作,不知道为什么......:

var
  NSSModule: HModule;
begin
  NSSModule := LoadLibrary('C:\Program Files (x86)\Mozilla Firefox\nss3.dll');

【问题讨论】:

  • 我们无法调试您未向我们展示的代码。如果您需要帮助找出代码不起作用的原因,请发布您的代码。在此之前,您可以阅读 MSDN 上LoadLibrary 的文档,特别是关于它如何定位库的部分。
  • 您的应用程序是 32 位还是 64 位?您不能将 32 位 DLL 加载到 64 位进程中(反之亦然)...
  • @SertacAkyuz GetLastError 返回 126(未找到模块),有趣的是 .dll 在那里。
  • @jlahd 我的应用程序是在 64 位 Windows 上运行的 32 位,我认为 .dll 是 32 位。

标签: delphi firefox delphi-xe2 loadlibrary


【解决方案1】:

您正在加载的 dll 正在尝试在同一文件夹 (mozglue.dll) 中静态加载另一个 dll。这就是为什么当您设置工作目录时它起作用的原因。如果不这样做,由于firefox的路径不在系统路径中,api无法找到dll。您可以找到有关 dll 搜索的详细信息 here

【讨论】:

    【解决方案2】:

    对此的解释是 DLL 本身链接到位于同一目录中的其他 DLL。如果不加载这些其他依赖项,则无法加载 DLL。加载程序尝试加载失败的依赖项。

    此 DLL 的预期主机是 Firefox,它也位于同一目录中。当 Firefox 加载 DLL 时,依赖关系被成功解析,因为 DLL 搜索路径搜索包含可执行文件的目录。但是当您的程序尝试加载模块时,无法找到依赖模块,因为您的可执行文件位于不同的目录中。

    您报告的错误代码是ERROR_MOD_NOT_FOUND。这指的是依赖项之一,而不是您加载的模块。事实上,这在加载程序错误中很常见。您可能会遇到难以置信的错误代码,但通常的解释是它们指的是解决依赖模块的错误。

    修改工作目录不是解决办法。这确实解决了您的问题,但您不应该依赖工作目录来解决依赖关系。系统提供的影响 DLL 搜索的机制是SetDllDirectoryAddDllDirectory。例如:

    SetDllDirectory('C:\Program Files (x86)\Mozilla Firefox');
    NSSModule := LoadLibrary('nss3.dll');
    SetDllDirectory(nil);
    

    此处需要阅读 MSDN 主题 Dynamic-Link Library Search Order

    【讨论】:

    • 我做了一些不同的事情,我在加载 nss3.dll 之前在 mozglue.dll 上调用了 LoadLibrary,也可以。
    • 这也很脆弱。我不知道你为什么不按标准方式做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多