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

Fragt ein COM-Objekt nach einem Zeiger auf eine seiner Schnittstelle ab. Identifizieren der Schnittstelle durch einen Verweis auf ihren Schnittstellenbezeichner (IID). Wenn das COM-Objekt die Schnittstelle implementiert, gibt es einen Zeiger auf diese Schnittstelle zurück, nachdem IUnknown::AddRef aufgerufen wurde.

Syntax

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

Parameter

riid

Typ: REFIID

Ein Verweis auf den Schnittstellenbezeichner (Interface Identifier, IID) der abzufragten Schnittstelle.

ppvObject

Typ: void**

Die Adresse eines Zeigers auf eine Schnittstelle mit dem im riid-Parameter angegebenen IID. Da Sie die Adresse eines Schnittstellenzeigers übergeben, kann die -Methode diese Adresse mit dem Zeiger auf die schnittstelle überschreiben, nach der abgefragt wird. Nach erfolgreicher Rückgabe enthält *ppvObject (die abgeleitete Adresse) einen Zeiger auf die angeforderte Schnittstelle. Wenn das Objekt die Schnittstelle nicht unterstützt, legt die Methode *ppvObject (die dereferente Adresse) auf fest nullptr.

Rückgabewert

Diese Methode gibt S_OK zurück, wenn die Schnittstelle unterstützt wird, und E_NOINTERFACE andernfalls. Wenn ppvObject (die Adresse) ist nullptr, gibt diese Methode E_POINTER zurück.

Hinweise

Für ein beliebiges COM-Objekt (auch als COM-Komponente bezeichnet) muss eine bestimmte Abfrage für die IUnknown-Schnittstelle auf einer der Schnittstellen des Objekts immer denselben Zeigerwert zurückgeben. Dadurch kann ein Client ermitteln, ob zwei Zeiger auf dieselbe Komponente zeigen, indem QueryInterface mit IID_IUnknown aufgerufen und die Ergebnisse verglichen werden. Es ist insbesondere nicht der Fall, dass Abfragen für andere Schnittstellen als IUnknown (auch die gleiche Schnittstelle über denselben Zeiger) den gleichen Zeigerwert zurückgeben müssen.

Es gibt vier Anforderungen für Implementierungen von QueryInterface (In diesen Fällen bedeutet "muss erfolgreich sein", bis auf einen schwerwiegenden Fehler.)

  • Der Satz von Schnittstellen, auf die für ein Objekt über QueryInterface zugegriffen werden kann, muss statisch und nicht dynamisch sein. Das bedeutet, wenn ein Aufruf von QueryInterface für einen Zeiger auf eine angegebene Schnittstelle zum ersten Mal erfolgreich ist, muss er erneut erfolgreich sein. Wenn der Aufruf beim ersten Mal fehlschlägt, muss er bei allen nachfolgenden Aufrufen fehlschlagen.
  • Es muss reflexiv sein: Wenn ein Client einen Zeiger auf eine Schnittstelle für ein Objekt enthält und der Client diese Schnittstelle abfragt, muss der Aufruf erfolgreich sein.
  • Sie muss symmetrisch sein. Wenn ein Client einen Zeiger auf eine Schnittstelle erfolgreich für eine andere abfragt, muss eine Abfrage über den abgerufenen Zeiger für die erste Schnittstelle erfolgreich sein.
  • Sie muss transitiv sein. Wenn ein Client, der einen Zeiger auf eine Schnittstelle hält, eine zweite erfolgreich abfragt, und durch diese Zeigerabfragen erfolgreich für eine dritte Schnittstelle, muss eine Abfrage für die erste Schnittstelle über den Zeiger für die dritte Schnittstelle erfolgreich sein.

Hinweise für Implementierer

Implementierungen von QueryInterface dürfen keine ACLs überprüfen. Der Standard Grund für diese Regel ist, dass COM erfordert, dass ein Objekt, das eine bestimmte Schnittstelle unterstützt, immer erfolgreich ist, wenn es nach dieser Schnittstelle abgefragt wird. Ein weiterer Grund ist, dass die Überprüfung von ACLs auf QueryInterface keine wirkliche Sicherheit bietet, da jeder Client, der Zugriff auf eine bestimmte Schnittstelle hat, diese direkt an einen anderen Client übergeben kann, ohne dass der Server aufgerufen wird. Da COM Schnittstellenzeiger zwischenspeichert, wird QueryInterface auf dem Server nicht jedes Mal aufgerufen, wenn ein Client eine Abfrage ausführt.

Anforderungen

Anforderung Wert
Unterstützte Mindestversion (Client) Windows 2000 Professional [nur Desktop-Apps]
Unterstützte Mindestversion (Server) Windows 2000 Server [nur Desktop-Apps]
Zielplattform Windows
Kopfzeile unknwn.h

Weitere Informationen