Regeln für die Implementierung von QueryInterface
Es gibt drei Hauptregeln, die die Implementierung der IUnknown::QueryInterface-Methode für ein COM-Objekt steuern:
- Objekte müssen eine Identität haben.
- Der Satz von Schnittstellen für eine Objektinstanz muss statisch sein.
- Es muss möglich sein, eine beliebige Schnittstelle für ein Objekt von einer anderen Schnittstelle aus erfolgreich abfragen zu können.
Objekte müssen eine Identität haben
Für jede objektinstanz muss ein Aufruf von QueryInterface mit IID IUnknown immer den gleichen 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 die gleiche Instanz eines Objekts zeigen.
Der Satz von Schnittstellen für eine Objektinstanz muss statisch sein.
Der Satz von Schnittstellen, auf die über QueryInterface auf ein Objekt zugegriffen werden kann, muss statisch und nicht dynamisch sein. Wenn QueryInterface einmal S OK für eine bestimmte IID zurückgibt, darf sie bei nachfolgenden Aufrufen desselben Objekts nie _ E _ NOINTERFACE zurückgeben. 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.
Eine erfolgreiche Abfrage für eine beliebige Schnittstelle für ein Objekt muss über eine beliebige andere Schnittstelle möglich sein.
Das heißt, wenn der folgende Code verwendet wird:
IA * pA = (some function returning an IA *);
IB * pB = NULL;
HRESULT hr;
hr = pA->QueryInterface(IID_IB, &pB);
Es gelten die folgenden Regeln:
Wenn Sie über einen Zeiger auf eine Schnittstelle für ein Objekt verfügen, muss ein Aufruf wie der folgende an 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 von diesem Zeiger für die erste Schnittstelle erfolgreich sein. Wenn pB erfolgreich erhalten wurde, muss auch Folgendes erfolgreich sein:
pB->QueryInterface(IID_IA, ...)Jede Schnittstelle muss in der Lage sein, abfragen zu können, ob eine andere Schnittstelle für ein Objekt verwendet wird. Wenn pB erfolgreich erhalten wurde und Sie erfolgreich eine dritte Schnittstelle (IC) mit diesem Zeiger abfragen, müssen Sie auch in der Lage sein, ic mit dem ersten Zeiger, pA, erfolgreich abfragen zu können. 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 Indikator ausstehender Zeigerverweise auf alle Schnittstellen eines bestimmten Objekts verwalten. Sie sollten eine ganze Zahl ohne Vorzeichen für den Zähler verwenden.
Wenn ein Client wissen muss, dass Ressourcen frei wurden, muss er vor dem Aufruf von IUnknown::Releaseeine Methode in einer Schnittstelle des Objekts mit semantischer Semantik auf höherer Ebene verwenden.