Pergunta

Oficialmente não se deve usar parâmetros [out] de funções COM menos que a função sucedeu isto significa que existem (pelo menos) três maneiras de ver se um parâmetro [out] pode ser usado.

Considere a seguinte interface

interface IFoo : IUnknown {
    HRESULT GetOtherFoo([out] IFoo** ppFoo);
    HRESULT Bar();
};

Qual das seguintes maneiras que você recomendaria em usá-lo?

1. valor de verificação de retorno

CComPtr<IFoo> other;
HRESULT hr = foo->GetOtherFoo(&other);
if (SUCCEEDED(hr)) 
    other->Bar();

Isto faz-me um pouco nervoso desde um bug no IFoo poderia causar uma dereferencing ponteiro NULL.

2. Verifique o parâmetro de saída

Isso depende do fato de que se um método falhar, ele não deve alterar qualquer um dos parâmetros [out] (se o parâmetro mudou <==> é seguro para usá-lo).

CComPtr<IFoo> other;
foo->GetOtherFoo(&other);
if (other) 
    other->Bar();

Note que este tipo de acontece de qualquer maneira, destruidor de CComPtr chamará Release se o ponteiro não é NULL por isso não pode ser lixo.

3. A forma paranóica, verificar tanto

CComPtr<IFoo> other;
HRESULT hr = foo->GetOtherFoo(&other);
if (SUCCEEDED(hr) && other) 
    other->Bar();

Este é um pouco detalhado na minha opinião.


P.S. Consulte pergunta relacionada .

Foi útil?

Solução

Se você estiver disposto a escrever mais cheques e tornar o código um pouco mais lento para torná-lo opção mais confiável 3 é para você. Desde que você espera que existem erros no servidor COM é bastante razoável para verificar contra eles.

Outras dicas

Com métodos de servidor que retornam um HRESULT sucesso, ainda definir alguns dos seus parâmetros de saída para NULL não são muito comuns. Existem alguns casos (IClientSecurity :: QueryBlanket vem à mente), onde este é usado, mas geralmente o cliente pode esperar que todos os parâmetros de saída a ser não-NULL se o método retornado com êxito.

É, afinal, uma questão de como o método está documentado. No caso padrão, no entanto, eu consideraria 1. ser um caminho seguro para ir.

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