realocar Maio COM servidor ([in, out] CACLSID * arg)?
-
03-07-2019 - |
Pergunta
Com um método de interface COM declarada como este:
[ object,
uuid(....),
]
interface IFoo : IUnknown
{
HRESULT Foo([in, out] CACLSID * items);
}
Com relação à triagem, é o servidor permitido para realocar a matriz contadas? (I pensar que é, mas eu não tenho certeza anymore)
A sua implementação atual só substitui a existente ID do, mas eu gostaria de implementar uma mudança (que não iria quebrar contrato) que pode retornar mais itens sem a introdução de uma nova interface.
[editar] Por favor note que CACLSID já é uma matriz, que contém uma contagem e um ponteiro.
Solução
Eu não fiz COM por um longo tempo, mas é mesmo possível alocar uma nova matriz? Nesse caso, ele não deve ser CACLSID ** items
?
Outras dicas
Você deve dar o conde como o segundo parâmetro que indica o espaço para tantos número de elementos, usando este COM marechais biblioteca os elementos
Em primeiro lugar, se você quiser Foo
a aceitar uma em ordem, você deve adicionar um paramter que dá a contagem, por exemplo:.
HRESULT Foo([in] int cItems, [in, out, size_is(cItems)] CACLSID * items);
Atenção:., Este código não foi compilado, apenas saindo documentação
Em segundo lugar, você não pode modificar o comportamento externo deste método sem alterar a sua declaração. Para redimensionamento apoio, você precisa ser capaz de realocar a matriz e passar de volta o seu endereço. Você pode usar um SAFEARRAY
ou declarar cItems
e items
como ponteiros para o tipo de original Foo
leva, por exemplo:.
HRESULT FooMutate([in, out] int *cItems, [in, out, size_is(*cItems)] CACLSID **items);
Novamente, não é compilado, assim que você realmente tem que saber o que você está fazendo se você usar isso.