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?

Foi útil?

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, e E_NOINTERFACE contrário. Se ppvObject é NULL, este método retorna E_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:

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