Como devo verificar se [out] parâmetros em COM pode ser usado?
-
03-07-2019 - |
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 .
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.