我有一个进程正在从文档搜索顺序中未列出的位置加载 DLL(下面链接的文档)。我想知道为什么。
这是我的设置的描述:
- 我有一个包含 a.dll 和 b.dll 的文件夹“c:\foo”。
- 我有一个 python 脚本也存储在 c:\foo 中。
- python 脚本执行 LoadLibrary('c:/foo/a.dll') (通过 ctypes)
- a.dll 链接到 b.dll 的导入库(即使用隐式链接)。
- 我使用当前目录运行 python 脚本,例如 c:。它可以是任何东西。
- b.dll 是从 c:\foo 加载的,即使它不在搜索路径上。
- 查看进程监视器跟踪,我可以看到首先尝试了所有记录的搜索路径,但都失败了。然后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 文章解释了默认搜索顺序。我引用:
- lpFileName 指定的目录。
- 系统目录。使用 GetSystemDirectory 函数获取该目录的路径。
- 16 位系统目录。没有函数获取这个目录的路径,但是被搜索了。
- Windows 目录。使用 GetWindowsDirectory 函数获取该目录的路径。
- 当前目录。
- PATH 环境变量中列出的目录。请注意,这不包括 App Paths 注册表项指定的每个应用程序路径。计算 DLL 搜索路径时不使用 App Paths 键。