Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 未从记录的搜索路径加载DLL_Python_Matlab_Dll_Process Monitor - Fatal编程技术网

Python 未从记录的搜索路径加载DLL

Python 未从记录的搜索路径加载DLL,python,matlab,dll,process-monitor,Python,Matlab,Dll,Process Monitor,我有一个进程,它正在加载一个DLL从一个地方没有列出的文件搜索顺序(文档链接如下)。我想知道为什么 以下是我的设置说明: 我有一个文件夹“c:\foo”,其中包含a.dll和b.dll 我有一个python脚本也存储在c:\foo中 python脚本执行LoadLibrary('c:/foo/a.dll')(通过ctypes) a、 dll链接到b.dll的导入库(即使用隐式链接) 我使用当前目录(比如c:)运行python脚本。它可能是任何东西 b.dll是从c:\foo加载的,即使它不在搜索

我有一个进程,它正在加载一个DLL从一个地方没有列出的文件搜索顺序(文档链接如下)。我想知道为什么

以下是我的设置说明:

  • 我有一个文件夹“c:\foo”,其中包含a.dll和b.dll
  • 我有一个python脚本也存储在c:\foo中
  • python脚本执行LoadLibrary('c:/foo/a.dll')(通过ctypes)
  • a、 dll链接到b.dll的导入库(即使用隐式链接)
  • 我使用当前目录(比如c:)运行python脚本。它可能是任何东西
  • b.dll是从c:\foo加载的,即使它不在搜索路径上。
  • 查看process monitor跟踪,我可以看到所有记录在案的搜索路径都是先尝试的,但都失败了。然后python进程尝试打开“C:\WINDOWS\assembly\GAC\Microsoft.VC80.CRT.mui\8.0.50727.4053_en-US_1fc8B3B9A118E3B\Microsoft.VC80.CRT.mui.DLL”,但失败,然后它打开了C:\foo\b.DLL。
  • 因此,似乎在a.dll的目录中搜索b.dll,即使文档没有说应该这样做。此外,在查看系统路径后会发生这种情况,这是疯狂的。有人能解释一下吗

    同样的事情也发生在同样使用.dll的MatLab脚本上

    我正在运行Windows XP SP 3

    解释默认的搜索顺序。我引述:

  • lpFileName指定的目录
  • 系统目录。使用GetSystemDirectory函数获取此目录的路径
  • 16位系统目录。没有获取此目录路径的函数,但会对其进行搜索
  • Windows目录。使用GetWindowsDirectory函数获取此目录的路径
  • 当前目录
  • PATH环境变量中列出的目录。请注意,这不包括应用程序路径注册表项指定的每个应用程序路径。计算DLL搜索路径时不使用应用路径键

  • a、 dll可能正在使用运行时动态链接作为最后手段

    您不能静态链接到dll。你的意思是隐式链接。@David:谢谢,我以前没听说过它叫隐式链接。在MS对隐式链接的定义中,他们说,“通过隐式链接,使用DLL的可执行文件链接到导入库(.lib文件)”。我会更新这个问题。顺便说一句,微软的引用来自@AndrewBainbridge:你是如何编译DLL的?例如,在GCC中,您可以在编译期间使用
    -rpath
    选项指定运行库搜索路径:。也许VC++编译器也有类似的选项……很好,但我应该说我写了一个.dll,所以我知道它不包含LoadLibrary调用。