QueryInterfaceQueryInterface

Embora existam mecanismos pelos quais um objeto pode expressar a funcionalidade que ele fornece estaticamente (antes de ser instanciado), o mecanismo de COM fundamental é usar o IUnknown método chamado QueryInterface.Although there are mechanisms by which an object can express the functionality it provides statically (before it is instantiated), the fundamental COM mechanism is to use the IUnknown method called QueryInterface.

Cada interface é derivada de IUnknown , portanto, cada interface tem uma implementação de QueryInterface .Every interface is derived from IUnknown, so every interface has an implementation of QueryInterface. Independentemente da implementação, esse método consulta um objeto usando o IID da interface à qual o chamador deseja um ponteiro.Regardless of implementation, this method queries an object using the IID of the interface to which the caller wants a pointer. Se o objeto der suporte a essa interface, o QueryInterface recuperará um ponteiro para a interface, enquanto também chama AddRef .If the object supports that interface, QueryInterface retrieves a pointer to the interface, while also calling AddRef. Caso contrário, ele retornará o código de erro E_NOINTERFACE.Otherwise, it returns the E_NOINTERFACE error code.

Observe que você deve obedecer às regras de contagem de referência em todos os momentos.Note that you must obey Reference Counting rules at all times. 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.If you call Release on an interface pointer to decrement the reference count to zero, you should not use that pointer again. Ocasionalmente, talvez seja necessário obter uma referência fraca a um objeto (ou seja, você pode desejar 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 .Occasionally you may need to obtain a weak reference to an object (that is, you may wish to obtain a pointer to one of its interfaces without incrementing the reference count), but it is not acceptable to do this by calling QueryInterface followed by Release. O ponteiro obtido de maneira tal é inválido e não deve ser usado.The pointer obtained in such a manner is invalid and should not be used. Isso se torna aparente quando _ATL_DEBUG_INTERFACES é definido, portanto definir essa macro é uma maneira útil de localizar bugs de contagem de referência.This more readily becomes apparent when _ATL_DEBUG_INTERFACES is defined, so defining this macro is a useful way of finding reference counting bugs.

Veja tambémSee also

Introdução ao COMIntroduction to COM
QueryInterface: navegando em um objetoQueryInterface: Navigating in an Object