3

我有一个进程正在从文档搜索顺序中未列出的位置加载 DLL(下面链接的文档)。我想知道为什么。

这是我的设置的描述:

  1. 我有一个包含 a.dll 和 b.dll 的文件夹“c:\foo”。
  2. 我有一个 python 脚本也存储在 c:\foo 中。
  3. python 脚本执行 LoadLibrary('c:/foo/a.dll') (通过 ctypes)
  4. a.dll 链接到 b.dll 的导入库(即使用隐式链接)。
  5. 我使用当前目录运行 python 脚本,例如 c:。它可以是任何东西。
  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 键。
4

1 回答 1

0

a.dll is probably using runtime dynamic linking as a last resort http://msdn.microsoft.com/en-us/library/ms686944%28VS.85%29.aspx

于 2011-07-09T21:12:56.040 回答