未从文档搜索路径加载DLL

3 投票
1 回答
940 浏览
提问于 2025-04-16 20:39

我有一个程序,它从一个不在文档搜索顺序中的地方加载一个DLL文件(下面有相关文档链接)。我想知道这是为什么。

以下是我的设置描述:

  1. 我有一个文件夹 'c:\foo',里面有 a.dll 和 b.dll。
  2. 我还有一个存放在 c:\foo 的 Python 脚本。
  3. 这个 Python 脚本通过 ctypes 调用了 LoadLibrary('c:/foo/a.dll')。
  4. a.dll 是通过隐式链接与 b.dll 的导入库关联的。
  5. 我在当前目录为 c: 的情况下运行这个 Python 脚本。当前目录可以是任何地方。
  6. 尽管 b.dll 不在搜索路径中,但它还是从 c:\foo 加载了。
  7. 查看进程监视器的跟踪记录,我发现所有文档中列出的搜索路径都先被尝试过,但都失败了。然后 Python 进程尝试打开 "C:\WINDOWS\assembly\GAC\Microsoft.VC80.CRT.mui\8.0.50727.4053_en-US_1fc8b3b9a1e18e3b\Microsoft.VC80.CRT.mui.DLL",接着它打开了 c:\foo\b.dll。

所以,看起来 a.dll 的目录在搜索 b.dll,尽管文档上没有说明应该这样做。而且,这发生在系统路径查找之后,这真是让人困惑。有没有人能解释一下这个情况?

同样的事情也发生在一个使用 a.dll 的 MatLab 脚本中。

我正在运行 Windows XP SP 3。

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

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

1 个回答

0

a.dll 可能是在最后的情况下使用了运行时动态链接。

你可以在这里了解更多信息:http://msdn.microsoft.com/en-us/library/ms686944%28VS.85%29.aspx

撰写回答