3

我正在通过comtypes模块从 Python 使用第 3 方 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为长度为字节的数组,如下所示:lSizeGetPacket()

pPacket = new BYTE[lSize];
HRESULT hr = pData->GetPacket(guid, lSize, pPacket);

但是,Python 的 comtypes 库不提供传递初始值的方法pData-- 并且,在调用没有初始值的库时,解释器会立即出现段错误。

是否可以从 Python 与这个库进行互操作——理想情况下,从comtypes?

4

1 回答 1

1

对生成的GetPacket.

资料来源:[comtypes-users] 使用指向数组的指针调用方法的正确方法?

# change GetPacket so the second argument is in, not out
packet = (c_ubyte * size)()
data.GetPacket(guid, size, packet)

但是,请注意,类型库不包含有关size_is的信息length_is以及其他一些内容。这意味着跨单元和进程边界使用的通用类型库编组器代理和存根不会查看lSize确定要序列化的元素数量pData,它总是(尝试)序列化单个指向的项目。

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

于 2013-09-01T22:40:13.170 回答