0

我可以通过 COM 发送对象列表吗?我有我的班级,也有这个班级的名单。我需要通过 COM 函数发送它。我可以这样做吗?如果是,那么如何?我需要序列化编组吗?

4

3 回答 3

2

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,这是一种非常常见的变体枚举接口类型。这也解释了这些方法的作用。

于 2012-05-18T10:59:10.890 回答
1

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

如果接口的两边都有 C++,并且很乐意在 IDL 中定义接口并生成自定义编组代码,那么 IDL 包含一个可以使用的“size_is”属性。有关详细信息,请参见此处

于 2012-05-18T07:25:54.843 回答
0

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

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

于 2012-05-18T07:26:09.693 回答