QueryInterface

Embora haja mecanismos pelos quais um objeto possa expressar a funcionalidade fornecida estaticamente (antes de ser instanciado), o mecanismo COM fundamental é usar a IUnknownchamada de métodoQueryInterface.

Cada interface é derivada de IUnknown, portanto, cada interface tem uma implementação de QueryInterface. Independentemente da implementação, esse método consulta um objeto usando a IID da interface da qual o chamador deseja um ponteiro. Se o objeto der suporte a essa interface, QueryInterface recuperará um ponteiro para a interface, enquanto também chama AddRef. Caso contrário, ele retorna o código de erro E_NOINTERFACE.

Observe que você deve obedecer às regras de contagem de referência o tempo todo. Se você chamar Release em um ponteiro de interface para diminuir a contagem de referência para zero, não deverá usar esse ponteiro novamente. Ocasionalmente, talvez seja necessário obter uma referência fraca a um objeto (ou seja, talvez você queira obter um ponteiro para uma de suas interfaces sem incrementar a contagem de referência), mas não é aceitável fazer isso chamando QueryInterface seguido por Release. O ponteiro obtido dessa maneira é inválido e não deve ser usado. Isso se torna mais facilmente aparente quando _ATL_DEBUG_INTERFACES é definida, portanto, definir essa macro é uma maneira útil de localizar bugs de contagem de referência.

Confira também

Introdução ao COM
QueryInterface: navegando em um objeto