在 Windows 下,我正在尝试使用SomeLib.dll
Python 2.7 中用 C++ 编写的第 3 方 DLL (),使用ctypes
. 对于它的一些特性,这个库使用另一个 COM DLL ( SomeCOMlib.dll
),它本身使用另一个 DLL ( LibA.dll
)。
请注意,这不是直接从 Python 使用 COM DLL,而是使用从 Python 使用它的 DLL。
为了使与 Python 的集成更容易,我将要使用的调用分组到我自己的函数中,在一个新的MyLib.dll
DLL (情景)。本质上,我的库公开了 2 个函数:, (全部返回,无参数)。ctypes
extern "C"
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
失败,但我不确定它是否相关。)
我已经使用Dependency Walker查看了依赖层次结构。
SomeCOMlib.dll
没有列为 的依赖项SomeLib.dll
,尽管它显然是必需的,LibA.dll
也没有列为 的依赖项SomeCOMlib.dll
,尽管它在运行时也明确需要。
我从命令行运行所有内容,从这些 DLL 所在的目录中运行(并且 C++ 示例可执行文件工作正常)。我试图强制 PATH 包含该目录,并且我还尝试将 DLL 复制到我猜想它们可能会被拾取的各个地方(C:\Windows\System32
和C:\Python27\DLLs
),但没有成功。
SomeCOMlib.dll
也注册了regasm.exe
。
ctypes
当涉及到它自己对 COM 机制的使用(以及可能随后在那里加载其他 DLL)时,在普通 C++ 应用程序和 Python 应用程序中使用这个 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
。)