2012-05-18 37 views
0

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

+0

我认为你需要设置一个小的自定义编组,除了某些非常特殊的情况。请注意COM有它自己的称为SafeArray的序列。您可以将其用作中介。 –

+0

你可以参考我的网站或代码, –

+0

像https://www.google.com/search?q=com+safearray,例如,从http://vcfaq.mvps.org/com/4开始。 htm –

回答

1

如果接口的一边用“简单”类型的系统(比如VB6或脚本)编写,那么SAFEARRAY就是要走的路。 COM的通用编组可以照顾它。

如果你在接口的两边都有C++,并且很高兴在IDL中定义接口并生成自定义编组代码,那么IDL包含一个可以使用的“size_is”属性。详情请参阅here

0

在任何合理的程度上,std :: list都无法这样做。我确信有一些疯子可以管理它,但从我的经验来看,这不值得。如果不必是一个std :: list和一些链表,那么你必须定义一个新的COM接口并提供它的实现(它可以是std :: list的一个包装)或者找到一些第三方资源,适合您的目的。如果你没有太多的实现COM接口的经验,那么你需要做大量的阅读。

如果它可以是一个数组,那么你可以通过使用SAFEARRAY使你的生活变得更简单。 SAFEARRAYs可以更容易地与ATL的CComSafeArray一起使用,这几乎是一个包装。在处理COM对象时,它会尝试帮助您解决问题,例如引用计数。然后你可以在COM对象之间传递数组。只是要提醒你,你仍然需要关注谁来解除分配内存。

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); 
} 

,然后只需一个接口指针返回到该接口的实现,以允许客户端代码来枚举列表。 IEnumVARIANT检查MSDN docs,IEnumVARIANT是一个非常常见的枚举接口类型。这也解释了这些方法的作用。