0

使用这样声明的 COM 接口方法:

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

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

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

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

4

3 回答 3

1

我已经很久没有做 COM 了,但它甚至可以分配一个新的数组吗?在那种情况下不应该CACLSID ** items吗?

于 2009-03-02T13:52:59.720 回答
0

您应该将 Count 作为第二个参数,它指示这么多元素的空间,使用这个 COM 库编组元素

于 2009-03-02T15:43:17.553 回答
0

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

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

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

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

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

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

于 2009-03-02T15:58:24.007 回答