我有一个进程,它从未在文档化搜索顺序中列出的位置加载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.VC80.CRT.mui.DLL”,然后它打开c:\ foo \ b.dll。
醇>
所以,似乎a.dll的目录正在搜索b.dll,即使文档没有说它应该是。此外,这是在查看系统路径后发生的,这是疯狂的。任何人都可以对此有所了解吗?
同样的事情发生在同样使用a.dll的MatLab脚本中。
我正在运行Windows XP SP 3。
This MSDN article解释了默认搜索顺序。我引用:
- lpFileName指定的目录。
- 系统目录。使用GetSystemDirectory函数获取此目录的路径。
- 16位系统目录。没有函数可以获取此目录的路径,但会搜索它。
- Windows目录。使用GetWindowsDirectory函数获取此目录的路径。
- 当前目录。
- PATH环境变量中列出的目录。请注意,这不包括App Paths注册表项指定的每个应用程序路径。计算DLL搜索路径时不使用App Paths键。
醇>