未从文档搜索路径加载DLL
我有一个程序,它从一个不在文档搜索顺序中的地方加载一个DLL文件(下面有相关文档链接)。我想知道这是为什么。
以下是我的设置描述:
- 我有一个文件夹 'c:\foo',里面有 a.dll 和 b.dll。
- 我还有一个存放在 c:\foo 的 Python 脚本。
- 这个 Python 脚本通过 ctypes 调用了 LoadLibrary('c:/foo/a.dll')。
- 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。
这篇 MSDN 文章解释了默认的搜索顺序。我引用如下:
- lpFileName 指定的目录。
- 系统目录。可以使用 GetSystemDirectory 函数获取这个目录的路径。
- 16 位系统目录。没有函数可以获取这个目录的路径,但它会被搜索。
- Windows 目录。可以使用 GetWindowsDirectory 函数获取这个目录的路径。
- 当前目录。
- 在 PATH 环境变量中列出的目录。注意,这不包括由 App Paths 注册表键指定的每个应用程序路径。在计算 DLL 搜索路径时不会使用 App Paths 键。
1 个回答
0
a.dll 可能是在最后的情况下使用了运行时动态链接。
你可以在这里了解更多信息:http://msdn.microsoft.com/en-us/library/ms686944%28VS.85%29.aspx