我有一个使用Qt 4.x的Core、GUI和Network模块的C++应用程序。当用户执行某些操作时,它会调用Python回调函数,目的是让用户通过编写Python代码自定义这些回调函数。
当我尝试在回调函数中像这样导入PySide的QtNetwork模块时:
from PySide import QtNetwork
我遇到了以下错误:
dll load failed : the specified procedure could not be found
需要注意的是,当我导入QtCore和QtGui模块时,就不会出现这种错误。
我使用dependency walker尝试解决这个问题。当应用程序启动时,它会加载QtCore4.dll、QtGui4.dll和QtNetwork4.dll,这些都是放在我的应用程序目录中的C++ Qt DLLs。当我触发一个回调到我的python代码,导入来自PySide的QtNetwork时,它会加载QtNetwork.pyd,然后给我报错:
LoadLibraryExA("C:\Dev\Python27\lib\site-packages\PySide\QtNetwork.pyd", 0x00000000, LOAD_WITH_ALTERED_SEARCH_PATH) returned NULL. Error: the specified procedure could not be found (127).
我的
QtNetwork.pyd
的依赖树:(见图片)似乎表明它使用已经加载的C++ DLLs而不是PySide的DLLs,我猜这是因为它们的名称相同。有没有办法让它加载正确的DLL(即位于目录中的DLL)?还有,为什么QtCore和QtGui不会产生这样的冲突呢?
bin
目录中的DLL。 我认为真正的问题是.PYD
应该从PySide目录c:\dev\python27\...\pyside
加载DLL,而不是应用程序目录或Qt目录的bin
文件夹中的DLL。 即使将PySide目录添加到我的path
环境变量中,.PYD
也不会加载PySide DLL。 - Guillaume DepardonQTNETWORK4.DLL
,并将您的c:\dev\python27\...\pyside
放在C:\Qt\bin
目录之前,加入到您的path
中。 - tropath
中排在Qt\bin
目录之前,当应用程序启动时,它将尝试加载Python DLLs而不是C++ DLLs,并以入口点错误退出。 - Guillaume Depardon