如何通过 COM 发送列表

How to send list through COM

本文关键字:列表 COM 何通过      更新时间:2023-10-16

我可以通过COM发送对象列表吗?我有我的班级,还有一个这个班级的列表。我需要通过 COM 函数发送它。我能做到吗?如果是,那怎么做?是否需要序列化封送处理?

COM

没有确定任何特定的集合类型,它当然没有任何对列表进行建模的标准。 按照约定,您可以使用接口对任何集合进行建模。 假设您有一个 Foo 对象的集合,每个对象都实现 IFoo。 然后声明一个类似于以下内容的 IEnumFoo 接口:

interface IEnumFoo : IUnknown
{
    HRESULT Next( [in] ULONG celt,
                  [out, size_is(celt), length_is(*pceltFetched)] IFoo **rgelt,
                  [in,out,unique] ULONG *pceltFetched );
    HRESULT Skip( [in] ULONG celt);
    HRESULT Reset();
    HRESULT Clone( [out] IEnumFoo **ppenum );
}

然后只需返回指向此接口实现的接口指针,以允许客户端代码枚举列表。 查看 MSDN 文档中的 IEnumVARIANT,这是一种非常常见的变体枚举接口类型。 这也解释了这些方法的作用。

如果界面的一端将使用具有"更简单"类型系统的语言编写,例如VB6或脚本,那么SAFEARRAY就是要走的路。 COM的通用编组可以照顾它。

如果接口的两端都有C++,并且很乐意在 IDL 中定义接口并生成自定义编组代码,则 IDL 包含可以使用的"size_is"属性。 详情请看这里。

在任何合理的程度上,没有办法使用 std::list 做到这一点。我敢肯定有一些疯子可以管理它,但根据我的经验,这不值得。如果不必是 std::list 而只是一些链表,那么您必须定义一个新的 COM 接口并提供它的实现(它可以只是 std::list 的包装器(,或者找到一些具有足够实现的第三方资源。如果你在实现 COM 接口方面没有太多经验,则需要大量阅读。

如果它可以是一个数组,那么通过使用 SAFEARRAY ,您可以使您的生活更简单。SAFEARRAYs可以更容易地与ATL的CComSafeArray一起使用,它几乎是一个包装器。它试图在处理 COM 对象时帮助您避免诸如引用计数之类的问题。然后,只需在 COM 对象之间传递数组。只是要提醒您,您仍然需要注意谁负责取消分配内存。