可以COM服务器重新分配([in,out] CACLSID * arg)?
-
03-07-2019 - |
题
使用COM接口方法声明为:
[ object,
uuid(....),
]
interface IFoo : IUnknown
{
HRESULT Foo([in, out] CACLSID * items);
}
关于编组,服务器是否允许重新分配计数的数组? (我认为是,但我不确定了)
它当前的实现仅替换现有的ID,但我想实现一个更改(不会破坏合同),可能会返回更多项而不引入新接口。
[edit] 请注意 CACLSID 已经是一个数组,包含一个计数和一个指针。
解决方案
我很长时间没有完成COM,但是甚至可以分配一个新阵列吗?在这种情况下,它应该不是 CACLSID ** items
?
其他提示
你应该将Count作为第二个参数来指示这么多元素的空间,使用这个COM库封送元素
首先,如果你想让 Foo
接受一个in数组,你应该添加一个给出计数的参数,例如:
HRESULT Foo([in] int cItems, [in, out, size_is(cItems)] CACLSID * items);
警告:此代码尚未编译,只是关闭文档。
其次,您无法在不更改其声明的情况下修改此方法的extern行为。要支持调整大小,您需要能够重新分配数组并传回其地址。您可以使用 SAFEARRAY
或声明 cItems
和 items
作为原始类型 Foo
的指针,例如:
HRESULT FooMutate([in, out] int *cItems, [in, out, size_is(*cItems)] CACLSID **items);
同样,没有编译,所以如果你使用它,你实际上必须知道你正在做什么。
不隶属于 StackOverflow