QueryInterface
Aunque hay mecanismos por los que un objeto puede expresar la funcionalidad que proporciona estáticamente (antes de que tenga instancias), el mecanismo COM fundamental es usar el método IUnknown
denominado QueryInterface
.
Cada interfaz se deriva de IUnknown
, por lo que cada interfaz tiene una implementación de QueryInterface
. Independientemente de la implementación, este método consulta un objeto mediante el IID
de la interfaz a la que el autor de la llamada desea que vaya dirigido un puntero. Si el objeto admite esa interfaz, QueryInterface
recupera un puntero dirigido a la interfaz, al mismo tiempo que llama a AddRef
. De lo contrario, devuelve un código de error E_NOINTERFACE
.
Tenga en cuenta que debe obedecer las reglas del recuento de referencias en todo momento. Si llama a Release
en un puntero de interfaz para decrementar el recuento de referencias a cero, no debe volver a usar ese puntero. En ocasiones, es posible que necesite obtener una referencia débil a un objeto (es decir, es posible que desee obtener un puntero, dirigido a una de las interfaces del objeto, sin incrementar el recuento de referencias), pero no es aceptable hacerlo llamando a QueryInterface
seguida de Release
. El puntero obtenido de tal manera no es válido y no debe usarse. Esto se vuelve más evidente cuando _ATL_DEBUG_INTERFACES
se define, por lo que definir esta macro es una forma útil de encontrar errores de recuento de referencias.