written by T. Schmidt

COM & DCOM Objects


COM steht für Component Object Model, eine objektbezogene Programmierspezifikation von Microsoft ©, die über vordefinierte Routinen (sog. Schnittstellen) für eine konsistente Objektinteroperabilität sorgt. COM beruht nicht auf einem Quellcode-Standard, sondern auf einem binären Standard. Aus diesem Grund ist eine Kommunikation zwischen Objekten möglich, die in verschiedenen Sprachen geschrieben wurden und in verschiedenen Prozeßbereichen bzw. auf unterschiedlichen Plattformen ausgeführt werden. COM-Objekte lassen sich transparent erweitern, ändern und aktualisieren, weil sie mit eindeutigen Bezeichnern erstellt werden. Mit Einführung von COM+ erfolgte eine zusätzliche Erweiterung der COM Objekte seitens Microsoft ©.

DCOM ist die Bezeichnung für Distributed Component Object Model, womit auf die Möglichkeit von COM Objekten bezug genommen wird, Ihre Kommunikation über Objektgrenzen ja sogar über Betriebssystemgenzen hinaus erfolgen zu lassen. Distributed (verteilt) bezeichnet bei diesen Objekten die Möglichkeit über Prozessgrenzen hinaus zu Kommunizieren, also Schnittstellenmethoden der Objekte aufzurufen und deren Funktionen auszuführen.

Die Grundlage der COM Objecte sind Schnittstellen und Methoden-Prototypen, deren Funktionalität die Schnittstelle definiert. Zu diesen Methodendefinitionen gehören die Anzahl und die Typen der Parameter, der Rückgabetyp und das erwartete Verhalten. Um ein COM Object eindeutig Identifizieren zu können besitzt es eine sogenannte GUID. Die GUID ist ein 16 Byte (128 Bit) großer Binärwert der die Schnittstelle eindeutig identifiziert.

Beispiel 1. zeigt die Implementierung des allgemeinsten COM Objects, welches die Wurzel aller COM Objekte bildet. Jedes weitere COM Object ist von IUnknown abgeleitet und besitzt dessen Eigenschaften und Methoden. Die Methode QueryInterface ermöglicht es, ein Objekt abzufragen und über Zeiger auf die unterstützte Schnittstelle zuzugreifen. AddRef und Release bilden die zweite und dritte Methode. Diese Methoden dienen ausschließlich als Referenzzähler. Sie ermöglichen es einem Objekt, seine Lebensdauer zu überwachen und sich bei Bedarf selbst freizugeben. Solange der Referenzzähler nicht 0 ist, muß das Objekt im Speicher verbleiben. Wenn der Referenzzähler den Wert 0 erreicht, kann die Schnittstellenimplementierung die zugrundeliegenden Objekte problemlos freigeben.

Um Objekten die Möglichkeit zu geben über Prozessgrenzen hinaus zu kommunizieren, ist es erforderlich sie beim Betriebssystem anzumelden, zu registrieren. Dieses erfolgt mit speziellen Objekten, den Klassengeneratoren. Im Beispiel 2. ist die Implementierung eines DCOM Objekts in Delphi dargestellt. IEvent bildet die Schnittstelle des Objekts und die Vererbung der TAutoIntfObject-Eigenschaften ermöglicht die Registrierung des Objekts beim Betriebssystem, dem COM-Runtime System. Im Falle von Microsoft © Windows ist dies der Service Control Manager (SCM) oder auch als RPCSS.EXE bekannt. Es gibt noch andere Systeme die eine Verbindung ermöglichen. Sie nennt man Objekt-Request-Broker. Verwendung finden diese Systeme bei eigenständigen Entwicklungen (unabhängig vom Betriebssystem) wie zum Beispiel CORBA (Common Object Request Broker Architecture). Um über Prozessgrenzen hinaus zu kommunizieren ist ein Aufruf der Schnittstellenmethode IRemoteActivation des SCM erforderlich. Der SCM des Client Rechners ruft auf dem entfernten (remote) Rechner die Schnittstellenmethode IRemoteActivation.RemoteActivation dessen SCM auf und erhällt im Erfolgsfall einen Interface Pointer Identifier (IPID) und einen Object Exporter Identifier (OXID) Wert. Der OXID-Wert ist ein spezieller Wert der die Remote Procedure Call (RPC) Informationen enthält, die erforderlich sind um eine Verbindung über eine IPID zu ermöglichen.


 

Beispiel 1. IUnknown

IUnknown = class
function QueryInterface(const iid: TIID; var obj): HResult;
function AddRef: LongInt;
function Release: LongInt;
end;

Beispiel 2. IEvent interface

IEvent = interface
procedure GotMessage(const Name, Message: WideString);
end;

TEvent = class (TAutoIntfObject, IEvent);


 

Microsoft © ist eingetragenes Warenzeichen der Microsoft Corporation.