QueryInterfaceQueryInterface

Aunque hay mecanismos mediante el cual un objeto puede expresar la funcionalidad que proporciona estáticamente (antes de se crea una instancia), el mecanismo fundamental de COM es usar el IUnknown método llamado 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 interfaz se deriva IUnknown, por lo que cada interfaz tiene una implementación de QueryInterface.Every interface is derived from IUnknown, so every interface has an implementation of QueryInterface. Independientemente de la implementación, este método consulta un objeto mediante el IID de la interfaz a la que el llamador desea un puntero.Regardless of implementation, this method queries an object using the IID of the interface to which the caller wants a pointer. Si el objeto admite esa interfaz, QueryInterface recupera un puntero a la interfaz, mientras llama a AddRef.If the object supports that interface, QueryInterface retrieves a pointer to the interface, while also calling AddRef. En caso contrario, devuelve el código de error E_NOINTERFACE.Otherwise, it returns the E_NOINTERFACE error code.

Tenga en cuenta que debe obedecer recuento de referencias reglas en todo momento.Note that you must obey Reference Counting rules at all times. Si se llama a Release en un puntero de interfaz para reducir el recuento de referencias en cero, no debe usar ese puntero nuevo.If you call Release on an interface pointer to decrement the reference count to zero, you should not use that pointer again. En ocasiones necesitará obtener una referencia débil a un objeto (es decir, puede que desee obtener un puntero a una de sus interfaces sin incrementar el recuento de referencias), pero no es aceptable para ello, llame a QueryInterface seguido 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. El puntero obtenido de manera no es válido y no debe usarse.The pointer obtained in such a manner is invalid and should not be used. Esto con más facilidad hace evidente cuando _ATL_DEBUG_INTERFACES está definido, por lo que definir esta macro es una forma útil de los errores de recuento de referencias de búsqueda.This more readily becomes apparent when _ATL_DEBUG_INTERFACES is defined, so defining this macro is a useful way of finding reference counting bugs.

Vea tambiénSee Also

Introducción a COMIntroduction to COM
QueryInterface: Desplazarse por un objetoQueryInterface: Navigating in an Object