我可以通过COM发送对象列表吗? 我有我的班级,还有这个班级的清单。我需要通过COM函数发送它。我能这样做吗?如果是,那怎么样?我需要序列化封送吗?
答案 0 :(得分: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 docs的IEnumVARIANT,这是一种非常常见的变体枚举接口类型。这也解释了这些方法的作用。
答案 1 :(得分:1)
如果界面的一面用一种“简单”类型系统的语言编写,例如VB6或脚本,那么SAFEARRAY就是可行的方法。 COM的通用编组可以处理它。
如果您在界面的两侧都有C ++,并且您很乐意在IDL中定义界面并生成自定义编组代码,那么IDL包含可以使用的“size_is”属性。有关详细信息,请参阅here。
答案 2 :(得分:0)
在任何合理的程度上,使用std :: list都无法做到这一点。我敢肯定有一些疯子可以管理它,但从我的经验来看,这是不值得的。如果不必是std :: list和一些链表,那么你必须定义一个新的COM接口并提供它的实现(它可以只是std :: list的包装)或者找一些第三方资源,具有适合您的目的的适当实施。如果你没有太多实现COM接口的经验,那么你需要做一些大量的阅读。
如果它可以是阵列,那么使用SAFEARRAY可以让您的生活更轻松。 SAFEARR可以更容易地与ATL的CComSafeArray一起使用,这几乎是一个包装器。在处理COM对象时,它会尝试帮助/保存您的问题,例如引用计数。然后,您可以在COM对象之间传递数组。只是提醒你,你仍然需要注意谁负责取消分配内存。