我有一个进程,它正在从文档搜索顺序中未列出的位置加载DLL(链接到下面的文档)。我想知道为什么。
以下是我的设置描述:
- 我有一个包含a.dll和b.dll的文件夹"c:\foo"
- 我有一个python脚本也存储在c:\foo中
- python脚本执行LoadLibrary('c:/foo/a.dll')(通过ctypes)
- a.dll与b.dll的导入库链接(即使用隐式链接)
- 我使用当前目录(比如c:)运行python脚本。它可以是任何东西
- b.dll是从c:\foo加载的,即使它不在搜索路径上
- 查看进程监视器跟踪,我可以看到所有记录的搜索路径都是先尝试的,但都失败了。然后python进程尝试打开"C:\WINDOWS\assembly\GAC\Microsoft.VC80.CRT.mui\8.0.50727.4053_en-US_1fc8b3b9a1e18e3b\Microsoft.VP80.CRT.mui.DLL",但失败,然后打开C:\foo\b.DLL
因此,似乎是在a.dll的目录中搜索b.dll,尽管文档没有说应该搜索。此外,在查看系统路径后会发生这种情况,这太疯狂了。有人能说明这件事吗?
同样的事情也发生在同样使用.dll.的MatLab脚本中
我正在运行Windows XP SP 3。
这篇MSDN文章解释了默认的搜索顺序。我引用:
- lpFileName指定的目录
- 系统目录。使用GetSystemDirectory函数获取此目录的路径
- 16位系统目录。没有任何函数可以获取此目录的路径,但会对其进行搜索
- Windows目录。使用GetWindowsDirectory函数获取此目录的路径
- 当前目录
- PATH环境变量中列出的目录。请注意,这不包括App Paths注册表项指定的每个应用程序路径。计算DLL搜索路径时不使用App Paths键
a.dll可能使用运行时动态链接作为最后手段http://msdn.microsoft.com/en-us/library/ms686944%28VS.85%29.aspx