Se um implementador de IShellBrowser :: Método QueryActiveShellView chamar AddRef para o chamador?

StackOverflow https://stackoverflow.com/questions/1626038

Pergunta

Eu estou tentando implementar um IShellBrowser. Um método de tais é:

HRESULT STDMETHODCALLTYPE IShellBrowser::QueryActiveShellView(/* [out] */ __RPC__deref_out_opt IShellView **ppshv)

Este recebe o ponteiro vista shell ativo para o chamador (no meu caso, há apenas uma vista shell a qualquer momento).

Mas é muito claro se eu deveria chamar AddRef em nome do autor da chamada, ou se é de fato responsabilidade do chamador para fazer o seu próprio AddRef / versão?

Eu não sou de todo fã de programar-by-side-effect - e isso é exatamente o que AddRef seria - uma expectativa escondido no chamador, que o chamador não necessariamente saber sobre

.

E olhando para a documentação para IShellBrowser :: QueryActiveShellView, eles não fazem nenhuma menção a ele em tudo. Mas olhando para IUnknown :: AddRef, vemos que qualquer método que faz uma cópia de um ponteiro de interface deve chamar AddRef - http://msdn.microsoft.com/en-us/library/ms691379%28VS.85%29.aspx

Chame esse método para cada nova cópia de um ponteiro de interface que você faz. Por exemplo, se você está passando uma cópia de uma volta do ponteiro de um método, você deve chamar AddRef sobre esse ponteiro.

Foi útil?

Solução

Sim, COM tem um contrato muito detalhado sobre este comportamento: todos [out] parâmetros devem ser copiados (no caso de tipos de valor) ou AddRef: Ed. (No caso de ponteiros de interface)

Então, você definitivamente deve AddRef.

Outras dicas

É uma situação típica - você passa a propriedade do ponteiro de interface para o chamador. Então você chama AddRef() eo chamador irá chamar Release() quando já não precisa do objeto apontado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top