我有一个正在从文档搜索顺序中未列出的地方加载DLL的过程(文档链接如下)。我想知道为什么。未从文档搜索路径加载的DLL
这是我设置的描述:
- 我有一个文件夹 'C:\富' 包含A.DLL和B.DLL。
- 我有一个python脚本也存储在c:\ foo中。
- python脚本通过ctypes执行LoadLibrary('c:/foo/a.dll')
- 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
This MSDN article解释默认搜索顺序。我引用:
- 由lpFileName指定的目录。
- 系统目录。使用GetSystemDirectory函数获取此目录的路径。
- 16位系统目录。没有获得该目录路径的函数,但它被搜索。
- Windows目录。使用GetWindowsDirectory函数获取此目录的路径。
- 当前目录。
- PATH环境变量中列出的目录。请注意,这不包括App Paths注册表项指定的每个应用程序路径。计算DLL搜索路径时不使用App Paths键。
你不能静态链接到DLL。你的意思是隐式链接。 –
@David:谢谢,我之前没有听说它被称为隐式链接。在MS的隐式链接定义中,他们说:“使用隐式链接,使用DLL的可执行文件链接到导入库(.lib文件)”。我会更新这个问题。 –
顺便说一句,MS报价来自http://msdn.microsoft.com/en-us/library/9yd93633.aspx –