【问题标题】:Using COM interfaces with initialized OUT parameters via Python comtypes library通过 Python comtypes 库使用带有初始化 OUT 参数的 COM 接口
【发布时间】:2013-09-02 06:40:13
【问题描述】:

我正在通过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++ 示例代码在调用 GetPacket() 之前将 pData 初始化为长度为 lSize 的字节数组,如下所示:

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

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

是否可以通过 Python 与这个库进行互操作——理想情况下,来自comtypes

【问题讨论】:

    标签: python com 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,都只能在同一个公寓里工作。

    【讨论】:

    • 我在我的 python 应用程序中使用 comtype 实现 PortableDevice COM API 时遇到了困难,并且卡在了无法将正确的参数传递给 COM 方法的地方。 @acelent,能否请您提供您的联系方式...我需要像您这样的专家的付费咨询。
    • @NilayAnand,我做不到,对不起。有时间我会看一下你关于 Python 和 COM 的两个问题,但是对于这种支持,你可能应该询问 comtypes 的作者或维护者。
    猜你喜欢
    • 2014-08-12
    • 2023-01-15
    • 2013-05-06
    • 2015-02-03
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    相关资源
    最近更新 更多