我正在通过comtypes模块从Python使用第三方C ++库(通过COM导出类型库)。
其中一个可用调用定义了一个OUT参数,如下所示:
COMMETHOD([helpstring(u'method GetPacket')], HRESULT, 'GetPacket',
( ['in'], comtypes.gen._00020430_0000_0000_C000_000000000046_0_2_0.GUID, 'guid' ),
( ['in'], c_int, 'lSize' ),
( ['out'], POINTER(c_ubyte), 'pData' )),
库的作者提供的C ++示例代码在调用pData
之前将lSize
初始化为长度为GetPacket()
的字节数组,如下所示:
pPacket = new BYTE[lSize];
HRESULT hr = pData->GetPacket(guid, lSize, pPacket);
然而,Python的comtypes库没有提供传递pData
的初始值的方法 - 并且在调用没有初始值的库时,解释器会立即发生段错误。
是否可以从Python中与此库进行互操作 - 最好是从comtypes
?
答案 0 :(得分:1)
对生成的GetPacket
进行一些低级更改是可能的。
来源:[comtypes-users] Right way to call a method with a pointer to array?
# change GetPacket so the second argument is in, not out
packet = (c_ubyte * size)()
data.GetPacket(guid, size, packet)
但请注意,类型库不包含有关size_is
,length_is
和few other things的信息。这意味着在公寓和流程边界使用的通用typelib marshaller代理和存根将不会查看lSize
以确定从pData
序列化的元素数量,它将始终(尝试)序列化一个尖头项目。
换句话说,这种代码,无论是C ++还是Python,只能在同一个公寓中工作。