Método IUnknown::QueryInterface(REFIID,void**) (unknwn.h)

Consulta un objeto COM para un puntero a una de su interfaz; identificar la interfaz por una referencia a su identificador de interfaz (IID). Si el objeto COM implementa la interfaz, devuelve un puntero a esa interfaz después de llamar a IUnknown::AddRef en ella.

Sintaxis

HRESULT QueryInterface(
  REFIID riid,
  void   **ppvObject
);

Parámetros

riid

Tipo: REFIID

Referencia al identificador de interfaz (IID) de la interfaz para la que se consulta.

ppvObject

Tipo: void**

Dirección de un puntero a una interfaz con el IID especificado en el parámetro riid . Dado que se pasa la dirección de un puntero de interfaz, el método puede sobrescribir esa dirección con el puntero a la interfaz para la que se consulta. Tras la devolución correcta, *ppvObject (la dirección desreferenciada) contiene un puntero a la interfaz solicitada. Si el objeto no admite la interfaz , el método establece *ppvObject (la dirección desreferenciada) nullptren .

Valor devuelto

Este método devuelve S_OK si se admite la interfaz y , de lo contrario, E_NOINTERFACE. Si ppvObject (la dirección) es nullptr, este método devuelve E_POINTER.

Comentarios

Para cualquier objeto COM determinado (también conocido como componente COM), una consulta específica para la interfaz IUnknown en cualquiera de las interfaces del objeto siempre debe devolver el mismo valor de puntero. Esto permite a un cliente determinar si dos punteros apuntan al mismo componente llamando a QueryInterface con IID_IUnknown y comparando los resultados. En concreto, no es el caso de que las consultas de interfaces distintas de IUnknown (incluso la misma interfaz a través del mismo puntero) devuelvan el mismo valor de puntero.

Hay cuatro requisitos para las implementaciones de QueryInterface (en estos casos, "debe tener éxito" significa que "debe tener éxito al prohibir un error catastrófico").

  • El conjunto de interfaces accesibles en un objeto a través de QueryInterface debe ser estático, no dinámico. Esto significa que si una llamada a QueryInterface para un puntero a una interfaz especificada se realiza correctamente la primera vez, debe volver a realizarse correctamente. Si se produce un error en la llamada por primera vez, se debe producir un error en todas las llamadas posteriores.
  • Debe ser reflexivo: si un cliente contiene un puntero a una interfaz en un objeto y el cliente consulta esa interfaz, la llamada debe realizarse correctamente.
  • Debe ser simétrico: si un cliente que contiene un puntero a una interfaz consulta correctamente para otra, una consulta a través del puntero obtenido para la primera interfaz debe realizarse correctamente.
  • Debe ser transitivo: si un cliente que contiene un puntero a una interfaz consulta correctamente durante un segundo, y a través de esa consulta de puntero correctamente para una tercera interfaz, una consulta para la primera interfaz a través del puntero para la tercera interfaz debe realizarse correctamente.

Notas para los implementadores

Las implementaciones de QueryInterface nunca deben comprobar las ACL. La razón principal de esta regla es que COM requiere que un objeto que admita una interfaz determinada siempre devuelva éxito cuando se consulta para esa interfaz. Otra razón es que la comprobación de ACL en QueryInterface no proporciona ninguna seguridad real porque cualquier cliente que tenga acceso a una interfaz determinada puede entregarla directamente a otro cliente sin ninguna llamada al servidor. Además, dado que COM almacena en caché punteros de interfaz, no llama a QueryInterface en el servidor cada vez que un cliente realiza una consulta.

Requisitos

Requisito Value
Cliente mínimo compatible Windows 2000 Professional [solo aplicaciones de escritorio]
Servidor mínimo compatible Windows 2000 Server [solo aplicaciones de escritorio]
Plataforma de destino Windows
Encabezado unknwn.h

Consulte también