在 Windows 下,我尝试使用第 3 方 DLL (SomeLib.dll
)使用 Python 2.7 用 C++ 编程ctypes
。
对于其某些功能,该库使用另一个 COM DLL (SomeCOMlib.dll
),它本身使用其他DLL(LibA.dll
).
请注意,这并不是直接从 Python 使用 COM DLL,而是使用从 Python 中使用 COM DLL 的 DLL。
为了使与 Python 的集成更容易,我将我想要使用的调用分组到一个新的 DLL 中我自己的函数中(MyLib.dll
),也是用 C++ 编程,只是为了进行调用ctypes
更方便(使用extern "C"
并针对特定场景定制功能)。
本质上,我的库公开了 2 个函数:doSomethingSimple()
, doSomethingWithCOMobj()
(全部返回void
,无参数)。
“有效”依赖层次结构如下:
MyLib.dll
SomeLib.dll
SomeCOMlib.dll
LibA.dll
我能够编写一个简单的 C++ 控制台应用程序 (Visual C++),它使用MyLib.dll
并连续两次拨打电话都没有问题。
使用 Python/ctypes,第一个调用工作正常,但是使用 COM 的调用会抛出WindowsError: [Error -529697949] Windows Error 0xE06D7363
。
从库的其余行为中,我可以看到问题正是发生在进行 COM 调用的地方。
(简单的测试 C++ 应用程序也会或多或少地在同一个地方失败,如果LibA.dll
丢失了,但我不确定它是否相关。)
我使用以下命令查看了依赖关系层次结构依赖步行者 http://www.dependencywalker.com/.
SomeCOMlib.dll
没有被列为依赖项SomeLib.dll
,尽管这是明确要求的,并且LibA.dll
没有被列为依赖项SomeCOMlib.dll
,尽管在运行时也明确需要它。
我从命令行、这些 DLL 所在的目录中运行所有内容(并且 C++ 示例可执行文件工作正常)。
我尝试强制 PATH 包含该目录,并且还尝试将 DLL 复制到我猜测可能会被拾取的各个位置(C:\Windows\System32
and C:\Python27\DLLs
), 没有成功。SomeCOMlib.dll
还注册了regasm.exe
.
是什么导致在普通 C++ 应用程序和 Python 应用程序中使用此 DLL 之间存在这种差异?ctypes
当涉及到它自己对 COM 机制的使用(以及可能随后加载其他 DLL)时?
哪些步骤至少可以提供比以下更多的信息Windows Error 0xE06D7363
从Python,能够进一步调查问题?
Python 代码如下所示:
import ctypes
myDll = ctypes.WinDLL("MyLib.dll")
myDll.doSomethingSimple()
myDll.doSomethingWithCOMobj() # This statement throws the Windows Error
(测试 C++ 独立应用程序有效,链接到MyLib.dll
内进行完全相同的调用main
.)