可以COM服务器重新分配([in,out] CACLSID * arg)?

时间:2009-03-02 13:46:28

标签: c++ com marshalling midl

使用COM接口方法声明为:

[ object,
  uuid(....),
]
interface IFoo : IUnknown 
{
  HRESULT Foo([in, out] CACLSID * items);
}

关于编组,服务器是否允许重新分配计数的数组? (我认为是,但我不确定了)

它当前的实现仅替换现有的ID,但我想实现一个更改(不会破坏合同),可能会返回更多项而不引入新接口。

[edit] 请注意CACLSID已经是一个数组,包含一个计数和一个指针。

3 个答案:

答案 0 :(得分:1)

我很长时间没有完成COM,但是甚至可以分配一个新阵列?那不应该是CACLSID ** items吗?

答案 1 :(得分:0)

你应该将Count作为第二个参数来指示这么多元素的空间,使用这个COM库封送元素

答案 2 :(得分:0)

首先,如果你想让Foo接受一个in数组,你应该添加一个给出计数的参数,例如:

HRESULT Foo([in] int cItems, [in, out, size_is(cItems)] CACLSID * items);

警告:此代码尚未编译,只是关闭文档。

其次,您无法在不更改其声明的情况下修改此方法的extern行为。要支持调整大小,您需要能够重新分配数组并传回其地址。您可以使用SAFEARRAY或声明cItemsitems作为原始类型Foo的指针,例如:

HRESULT FooMutate([in, out] int *cItems, [in, out, size_is(*cItems)] CACLSID **items);

同样,没有编译,所以如果你使用它,你实际上必须知道你正在做什么。