Freigeben über


Regeln für die Implementierung von QueryInterface

Es gibt drei Hauptregeln für die Implementierung der IUnknown::QueryInterface-Methode für ein COM-Objekt:

  • Objekte müssen über Identität verfügen.
  • Der Satz von Schnittstellen in einer Objektinstanz muss statisch sein.
  • Es muss möglich sein, eine erfolgreiche Abfrage für jede Schnittstelle in einem Objekt von jeder anderen Schnittstelle aus durchzuführen.

Objekte müssen über Identität verfügen

Für jede angegebene Objektinstanz muss ein Aufruf QueryInterface- mit IID_IUnknown immer denselben physischen Zeigerwert zurückgeben. Auf diese Weise können Sie QueryInterface- für zwei Schnittstellen aufrufen und die Ergebnisse vergleichen, um zu bestimmen, ob sie auf dieselbe Instanz eines Objekts verweisen.

Der Satz von Schnittstellen für eine Objektinstanz muss statisch sein.

Der Satz von Schnittstellen, auf die über QueryInterface- für ein Objekt zugegriffen werden kann, muss statisch und nicht dynamisch sein. Wenn QueryInterface einmal S_OK für eine bestimmte IID zurückgibt, darf E_NOINTERFACE bei nachfolgenden Aufrufen desselben Objekts niemals zurückgegeben werden; und wenn QueryInterface E_NOINTERFACE für eine bestimmte IID zurückgibt, dürfen nachfolgende Aufrufe für dieselbe IID für dasselbe Objekt niemals S_OK zurückgeben.

Es muss möglich sein, eine erfolgreiche Abfrage für jede Schnittstelle für ein Objekt über eine beliebige andere Schnittstelle durchzuführen.

Dies gilt für den folgenden Code:

IA * pA = (some function returning an IA *); 
IB * pB = NULL; 
HRESULT   hr; 
hr = pA->QueryInterface(IID_IB, &pB); 
 

die folgenden Regeln gelten:

  • Wenn Sie einen Zeiger auf eine Schnittstelle in einem Objekt haben, muss ein Aufruf wie der folgende zum QueryInterface- für dieselbe Schnittstelle erfolgreich sein:

    pA->QueryInterface(IID_IA, ...) 
    
    
  • Wenn ein Aufruf von QueryInterface für einen zweiten Schnittstellenzeiger erfolgreich ist, muss auch ein Aufruf von QueryInterface- für die erste Schnittstelle erfolgreich sein. Wenn pB erfolgreich abgerufen wurde, muss folgendes ebenfalls erfolgreich sein:

    pB->QueryInterface(IID_IA, ...) 
    
    
  • Jede Schnittstelle muss in der Lage sein, jede andere Schnittstelle für ein Objekt abzufragen. Wenn pB erfolgreich abgerufen wurde und Sie mithilfe dieses Zeigers eine dritte Schnittstelle (IC) abfragen, müssen Sie auch in der Lage sein, mit dem ersten Zeiger pA erfolgreich nach IC abzufragen. In diesem Fall muss die folgende Sequenz erfolgreich sein:

    IC * pC = NULL; 
    hr = pB->QueryInterface(IID_IC, &pC); 
    pA->QueryInterface(IID_IC, ...) 
    
    

Schnittstellenimplementierungen müssen einen Zähler mit ausstehenden Zeigerverweisen auf alle Schnittstellen eines bestimmten Objekts verwalten. Sie sollten eine nicht signierten ganzzahligen für den Zähler verwenden.

Wenn ein Client wissen muss, dass Ressourcen freigegeben wurden, muss er eine Methode in einer Schnittstelle für das Objekt mit semantischer Höherer Ebene verwenden, bevor IUnknown::Releaseaufgerufen wird.

Verwenden und Implementieren von IUnknown-