QueryInterface: Navigieren in einem Objekt
Nachdem Sie über einen anfänglichen Zeiger auf eine Schnittstelle in einem Objekt verfügen, verfügt COM über einen sehr einfachen Mechanismus, um herauszufinden, ob das Objekt eine andere bestimmte Schnittstelle unterstützt, und wenn ja, um einen Zeiger darauf abzurufen. (Informationen zum Abrufen eines ersten Zeigers auf eine Schnittstelle für ein Objekt finden Sie unter Abrufen eines Zeigers auf ein Objekt.) Dieser Mechanismus ist die QueryInterface-Methode der IUnknown-Schnittstelle . Wenn das Objekt die angeforderte Schnittstelle unterstützt, muss die Methode einen Zeiger auf diese Schnittstelle zurückgeben. Dadurch kann ein Objekt frei durch die Schnittstellen navigieren, die von einem Objekt unterstützt werden. QueryInterface trennt die Anforderung "Unterstützen Sie einen bestimmten Vertrag?" von der leistungsstarken Nutzung dieses Vertrags nach erfolgreichen Verhandlungen.
Wenn ein Client anfänglich Zugriff auf ein Objekt erhält, erhält dieser Client mindestens einen IUnknown-Schnittstellenzeiger (die grundlegendste Schnittstelle), über den er die Lebensdauer des Objekts steuern kann– indem er dem Objekt mitteilt, wann es mit dem Objekt fertig ist – und QueryInterface aufrufen kann. Der Client ist so programmiert, dass jedes verwaltete Objekt einige Vorgänge ausführen soll, aber die IUnknown-Schnittstelle verfügt über keine Funktionen für diese Vorgänge. Stattdessen werden diese Vorgänge über andere Schnittstellen ausgedrückt. Der Client ist also so programmiert, dass er mit Objekten für diese Schnittstellen aushandelt. Insbesondere ruft der Client QueryInterface auf, um ein Objekt nach einer Schnittstelle zu fragen, über die der Client die gewünschten Vorgänge aufrufen kann.
Da das Objekt QueryInterface implementiert, kann es die Anforderung annehmen oder ablehnen. Wenn das Objekt die Anforderung des Clients akzeptiert, gibt QueryInterface einen neuen Zeiger auf die angeforderte Schnittstelle zum Client zurück. Über diesen Schnittstellenzeiger hat der Client Zugriff auf die Methoden dieser Schnittstelle. Wenn das -Objekt hingegen die Anforderung des Clients ablehnt, gibt QueryInterface einen NULL-Zeiger ( ein Fehler ) zurück, und der Client verfügt über keinen Zeiger, über den die gewünschten Funktionen aufgerufen werden sollen. In diesem Fall muss der Client diese Möglichkeit ordnungsgemäß behandeln. Angenommen, ein Client verfügt über einen Zeiger auf die Schnittstelle A für ein Objekt und fordert die Schnittstellen B und C an. Angenommen, das Objekt unterstützt Schnittstelle B, aber keine Schnittstelle C. Das Ergebnis ist, dass das Objekt einen Zeiger auf B zurückgibt und meldet, dass C nicht unterstützt wird.
Ein wichtiger Punkt ist, dass der Client das Objekt nicht auffordern kann, die über die angeforderte Schnittstelle ausgedrückten Vorgänge auszuführen, wenn ein Objekt einen Aufruf von QueryInterface ablehnt. Ein Client muss über einen Schnittstellenzeiger verfügen, um Methoden in dieser Schnittstelle aufzurufen. Wenn das Objekt die Bereitstellung des angeforderten Zeigers ablehnt, muss der Client bereit sein, darauf zu verzichten, entweder indem er nicht das tut, was er mit diesem Objekt tun wollte, oder indem er versucht, auf eine andere, vielleicht weniger leistungsfähige Schnittstelle zurückzugreifen. Dieses Feature der COM-Funktionalität funktioniert gut im Vergleich zu anderen objektorientierten Systemen, in denen Sie nicht wissen können, ob eine Funktion funktioniert, bis Sie diese Funktion aufrufen, und selbst dann ist die Behandlung eines Fehlers unsicher. QueryInterface bietet eine zuverlässige und konsistente Möglichkeit, um zu ermitteln, ob ein Objekt eine Schnittstelle unterstützt, bevor versucht wird, seine Methoden aufzurufen.
Die QueryInterface-Methode bietet auch eine robuste und zuverlässige Möglichkeit für ein Objekt, um anzugeben, dass es einen bestimmten Vertrag nicht unterstützt. Das heißt, wenn man in einem Aufruf von QueryInterface ein "altes" Objekt fragt, ob es eine "neue" Schnittstelle unterstützt (eine, die beispielsweise nach dem Versand des alten Objekts erfunden wurde), antwortet das alte Objekt zuverlässig, ohne einen Absturz zu verursachen, "nein". Die Technologie, die dies unterstützt, ist der Algorithmus, mit dem IIDs zugeordnet werden. Dies mag zwar wie ein kleiner Punkt erscheinen, ist aber für die Gesamtarchitektur des Systems äußerst wichtig, und die Möglichkeit, legacy-Elemente über neue Funktionen zu erfragen, ist überraschenderweise ein Feature, das in den meisten anderen Objektarchitekturen nicht vorhanden ist.
Zugehörige Themen