2011-07-01 31 views
3

我有一个正在从文档搜索顺序中未列出的地方加载DLL的过程(文档链接如下)。我想知道为什么。未从文档搜索路径加载的DLL

这是我设置的描述:

  1. 我有一个文件夹 'C:\富' 包含A.DLL和B.DLL。
  2. 我有一个python脚本也存储在c:\ foo中。
  3. python脚本通过ctypes执行LoadLibrary('c:/foo/a.dll')
  4. a.dll与b.dll的导入库(即使用隐式链接)相链接。
  5. 我运行python脚本的当前目录,比如c :.它可能是任何东西。
  6. b.dll从c:\ foo加载,即使这不在搜索路径中。
  7. 看着过程监视器跟踪,我可以看到所有记录的搜索路径都先尝试过,并且都失败了。然后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解释默认搜索顺序。我引用:

  1. 由lpFileName指定的目录。
  2. 系统目录。使用GetSystemDirectory函数获取此目录的路径。
  3. 16位系统目录。没有获得该目录路径的函数,但它被搜索。
  4. Windows目录。使用GetWindowsDirectory函数获取此目录的路径。
  5. 当前目录。
  6. PATH环境变量中列出的目录。请注意,这不包括App Paths注册表项指定的每个应用程序路径。计算DLL搜索路径时不使用App Paths键。
+0

你不能静态链接到DLL。你的意思是隐式链接。 –

+0

@David:谢谢,我之前没有听说它被称为隐式链接。在MS的隐式链接定义中,他们说:“使用隐式链接,使用DLL的可执行文件链接到导入库(.lib文件)”。我会更新这个问题。 –

+0

顺便说一句,MS报价来自http://msdn.microsoft.com/en-us/library/9yd93633.aspx –

回答