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