Freigeben über


Interface Pointers and Interfaces (Schnittstellenzeiger und Schnittstellen)

Ein instance einer Schnittstellenimplementierung ist tatsächlich ein Zeiger auf ein Array von Zeigern auf Methoden, d. h. eine Funktionstabelle, die auf eine Implementierung aller in der Schnittstelle angegebenen Methoden verweist. Objekte mit mehreren Schnittstellen können Zeiger auf mehrere Funktionstabellen bereitstellen. Jeder Code, der über einen Zeiger verfügt, über den er auf das Array zugreifen kann, kann die Methoden in dieser Schnittstelle aufrufen.

Genau über diese mehrfache Dereferenzierung zu sprechen ist umständlich, daher wird der Zeiger auf die Schnittstellenfunktionstabelle, die ein anderes Objekt benötigen muss, um seine Methoden aufrufen zu können, einfach als Schnittstellenzeiger bezeichnet. Sie können Funktionstabellen manuell in einer C-Anwendung oder fast automatisch mithilfe von Visual C++ (oder anderen objektorientierten Sprachen, die COM unterstützen) erstellen.

Mit geeigneter Compilerunterstützung (die in C und C++ inhärent ist) kann ein Client eine Schnittstellenmethode über seinen Namen und nicht über seine Position im Array aufrufen. Da eine Schnittstelle ein Typ ist, kann der Compiler unter Berücksichtigung der Namen von Methoden die Typen von Parametern und Rückgabewerte jedes Schnittstellenmethodenaufrufs überprüfen. Wenn ein Client dagegen ein positionsbasiertes Aufrufschema verwendet, ist eine solche Typüberprüfung nicht verfügbar, auch nicht in C oder C++.

Jede Schnittstelle ist ein unveränderlicher Vertrag einer funktionalen Gruppe von Methoden. Sie verweisen zur Laufzeit auf eine Schnittstelle mit einem global eindeutigen Schnittstellenbezeichner (Globally Unique Interface Identifier, IID). Diese IID, die eine spezifische instance eines von COM unterstützten global eindeutigen Bezeichners (GUID) ist, ermöglicht es einem Client, ein Objekt genau zu fragen, ob es die Semantik der Schnittstelle unterstützt, ohne unnötigen Mehraufwand und ohne die Verwirrung, die in einem System entstehen könnte, wenn mehrere Versionen derselben Schnittstelle mit demselben Namen vorhanden sind.

Zusammenfassend ist es wichtig zu verstehen, was eine COM-Schnittstelle ist und nicht:

  • Eine COM-Schnittstelle ist nicht mit einer C++-Klasse identisch. Die reine virtuelle Definition enthält keine Implementierung. Wenn Sie ein C++-Programmierer sind, können Sie Ihre Implementierung einer Schnittstelle als Klasse definieren, aber dies fällt unter die Überschrift der Implementierungsdetails, die COM nicht angibt. Ein instance eines Objekts, das eine Schnittstelle implementiert, muss erstellt werden, damit die Schnittstelle tatsächlich vorhanden ist. Darüber hinaus können verschiedene Objektklassen eine Schnittstelle unterschiedlich implementieren, aber austauschbar in binärer Form verwendet werden, solange das Verhalten der Schnittstellendefinition entspricht.
  • Eine COM-Schnittstelle ist kein -Objekt. Es ist einfach eine verwandte Gruppe von Funktionen und ist der binäre Standard, über den Clients und Objekte kommunizieren. Solange es Zeiger auf Schnittstellenmethoden bereitstellen kann, kann das Objekt in einer beliebigen Sprache mit einer beliebigen internen Zustandsdarstellung implementiert werden.
  • COM-Schnittstellen sind stark typisiert. Jede Schnittstelle verfügt über einen eigenen Schnittstellenbezeichner (guid), wodurch dupliziert werden kann, die bei jedem anderen Benennungsschema auftreten können.
  • COM-Schnittstellen sind unveränderlich. Sie können keine neue Version einer alten Schnittstelle definieren und ihr denselben Bezeichner geben. Das Hinzufügen oder Entfernen von Methoden einer Schnittstelle oder das Ändern der Semantik erstellt eine neue Schnittstelle und keine neue Version einer alten Schnittstelle. Daher kann eine neue Schnittstelle nicht mit einer alten Schnittstelle in Konflikt geraten. Objekte können jedoch mehrere Schnittstellen gleichzeitig unterstützen und Schnittstellen verfügbar machen, die aufeinanderfolgende Überarbeitungen einer Schnittstelle mit unterschiedlichen Bezeichnern sind. Daher ist jede Schnittstelle ein separater Vertrag, und systemweite Objekte müssen sich keine Gedanken darüber machen, ob die Version der Schnittstelle, die sie aufrufen, die sie erwarten. Die Schnittstellen-ID (IID) definiert den Schnittstellenvertrag explizit und eindeutig.

COM-Objekte und -Schnittstellen