Será que vale a verificação de ponteiro nulo em QueryInterface implementação ()?
-
07-07-2019 - |
Pergunta
IUnknown :: QueryInterface () é passado um parâmetro ** vazio denotando um endereço onde colocar a interface recuperada.
STDMETHOD QueryInterface(/* [in] */ REFIID riid, /* [iid_is][out] */ void** ppvObject)
Caso a implementação de QueryInterface () verificar esse ponteiro por ser nula (e, em seguida, retornar imediatamente E_POINTER) ou apenas escrever lá?
Eu vi um monte de código COM-relacionado e em quase toda parte nenhuma verificação é executada. Hipoteticamente alguém poderia naturalmente passar ponteiro nulo como esse parâmetro, mas é tal verificação realmente necessário?
Solução
Você (o chamador) não precisa verificar o ponteiro por não ser NULL
.
No entanto, você deve verificar o HRESULT
retornado. O método retornará E_POINTER
se o ponteiro de saída é NULL
e E_NOINTERFACE
se a interface não é suportado.
O receptor deve verificar o ponteiro por não ser NULL
e regresso E_POINTER
se é NULL
:
MSDN : Valor de retorno:
Este método retorna
S_OK
se a interface é suportado, eE_NOINTERFACE
contrário. SeppvObject
éNULL
, este método retornaE_POINTER
.
Outras dicas
De acordo com a MSDN docs , QueryInterface quer retorna S_OK, caso em que o parâmetro de saída será definida corretamente. Ou ele retorna E_NOINTERFACE, caso em que o parâmetro de saída não será definido.
Ele irá retornar E_POINTER se o vazio ** você passar é NULL.
Eu não me incomoda verificando null, em vez que eu iria verificar o valor de retorno de IUnknown :: QueryInterface
Há provavelmente nenhum dano na verificação de null, mas dadas as garantias da interface parece que uma verificação redundante.
Depende de que tipo de objeto COM estiver QI'ing (Ou qual aplicativo está hospedando você). Na maioria das vezes apenas verificar o HRESULT deve ser suficiente. Se você está lidando com objetos 3rd party (Explorador de substituição etc) você provavelmente deve também verificar para NULL. Explorer faz isso, e, portanto, é preciso também se você quiser evitar acidentes nas extensões de buggy: