通过Python comtypes库使用带有初始化OUT参数的COM接口

时间:2012-11-18 23:08:37

标签: python com comtypes

我正在通过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

1 个答案:

答案 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_islength_isfew other things的信息。这意味着在公寓和流程边界使用的通用typelib marshaller代理和存根将不会查看lSize以确定从pData序列化的元素数量,它将始终(尝试)序列化一个尖头项目。

换句话说,这种代码,无论是C ++还是Python,只能在同一个公寓中工作。