Metodo IUnknown::QueryInterface(REFIID,void**) (unknwn.h)

Esegue una query su un oggetto COM per un puntatore a una delle relative interfacce; identificazione dell'interfaccia da parte di un riferimento al relativo identificatore di interfaccia (IID). Se l'oggetto COM implementa l'interfaccia, restituisce un puntatore a tale interfaccia dopo aver chiamato IUnknown::AddRef .

Sintassi

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

Parametri

riid

Tipo: REFIID

Riferimento all'identificatore dell'interfaccia (IID) dell'interfaccia da eseguire una query.

ppvObject

Tipo: void**

Indirizzo di un puntatore a un'interfaccia con l'IID specificato nel parametro riid . Poiché si passa l'indirizzo di un puntatore dell'interfaccia, il metodo può sovrascrivere tale indirizzo con il puntatore all'interfaccia per cui viene eseguita una query. Al termine della restituzione, *ppvObject (indirizzo dereferenced) contiene un puntatore all'interfaccia richiesta. Se l'oggetto non supporta l'interfaccia, il metodo imposta *ppvObject (l'indirizzo dereferenced) su nullptr.

Valore restituito

Questo metodo restituisce S_OK se l'interfaccia è supportata e E_NOINTERFACE in caso contrario. Se ppvObject (indirizzo) è nullptr, questo metodo restituisce E_POINTER.

Commenti

Per qualsiasi oggetto COM specificato (noto anche come componente COM), una query specifica per l'interfaccia IUnknown in una delle interfacce dell'oggetto deve sempre restituire lo stesso valore del puntatore. Ciò consente a un client di determinare se due puntatori puntano allo stesso componente chiamando QueryInterface con IID_IUnknown e confrontando i risultati. Non è in particolare il caso in cui le query per le interfacce diverse da IUnknown (anche la stessa interfaccia tramite lo stesso puntatore) devono restituire lo stesso valore del puntatore.

Esistono quattro requisiti per le implementazioni di QueryInterface (in questi casi "deve avere esito positivo" significa che "deve avere esito positivo, a causa di un errore irreversibile").

  • Il set di interfacce accessibili in un oggetto tramite QueryInterface deve essere statico, non dinamico. Ciò significa che se una chiamata a QueryInterface per un puntatore a un'interfaccia specificata riesce la prima volta, deve essere nuovamente completata. Se la chiamata ha esito negativo la prima volta, deve avere esito negativo su tutte le chiamate successive.
  • Deve essere riflessivo: se un client contiene un puntatore a un'interfaccia su un oggetto e le query client per tale interfaccia, la chiamata deve avere esito positivo.
  • Deve essere simmetrico: se un client che mantiene un puntatore a una query di interfaccia correttamente per un'altra, una query tramite il puntatore ottenuto per la prima interfaccia deve avere esito positivo.
  • Deve essere transitiva: se un client che mantiene un puntatore a una query di interfaccia correttamente per un secondo e attraverso tale puntatore query correttamente per una terza interfaccia, una query per la prima interfaccia tramite il puntatore per la terza interfaccia deve avere esito positivo.

Note per gli implementatori

Le implementazioni di QueryInterface non devono mai controllare gli elenchi di controllo di accesso. Il motivo principale di questa regola è che COM richiede che un oggetto che supporta un'interfaccia specifica restituisca sempre esito positivo quando viene eseguita una query per tale interfaccia. Un altro motivo è che il controllo degli elenchi di controllo di accesso in QueryInterface non fornisce alcuna sicurezza reale perché qualsiasi client che ha accesso a un'interfaccia specifica può passare direttamente a un altro client senza alcuna chiamata al server. Inoltre, poiché i puntatori dell'interfaccia COM non chiamano QueryInterface nel server ogni volta che un client esegue una query.

Requisiti

Requisito Valore
Client minimo supportato Windows 2000 Professional [solo app desktop]
Server minimo supportato Windows 2000 Server [solo app desktop]
Piattaforma di destinazione Windows
Intestazione unknwn.h

Vedi anche