2012-11-18 42 views
3

我正在使用Python通过comtypes模块的第三方C++库(通过COM导出typelib)。通过Python使用COM接口初始化OUT参数comtypes库

其中一个可用的呼叫定义了一个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); 

然而,comtypes库Python没有提供一种方式来传递一个初始值pData - 而且,在调用库没有初始值时,INTE rpreter及时segfaults。

是否可以与来自Python的该库进行互操作 - 理想情况下,从comtypes

回答

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。这意味着在公寓和流程边界中使用的泛型类型编组代码和存根不会查看lSize以确定要从pData中序列化的元素数量,它总是(尝试)序列化单个指向的项目。

换句话说,那种类型的代码,无论是C++还是Python,都只能在同一个房间里工作。

+0

我很努力地在我的python应用程序中使用comtype实现PortableDevice COM API,并陷入了无法将正确的参数传递给COM方法的地方。 @acelent,你可以请传递你的联系方式......我需要像你这样的专家的有偿咨询。 –

+0

@NilayAnand,我不能那样做,我很抱歉。每当我有一段时间,我都会看看与Python和COM相关的两个问题,但对于这种支持,您应该问问comtypes作者或维护者。 – acelent