Freigeben über


COM-Klassenobjekte und CLSIDs

Ein COM-Server wird als COM-Klasse implementiert. Eine COM-Klasse ist eine Implementierung einer Gruppe von Schnittstellen in Code, die ausgeführt wird, wenn Sie mit einem bestimmten Objekt interagieren. Es gibt einen wichtigen Unterschied zwischen einer C++-Klasse und einer COM-Klasse: In C++ ist eine Klasse ein Typ, während eine COM-Klasse einfach eine Definition des Objekts ist und keinen Typ enthält, obwohl ein C++-Programmierer sie möglicherweise mithilfe einer C++-Klasse implementieren kann. COM ist so konzipiert, dass eine Klasse von verschiedenen Anwendungen verwendet werden kann, einschließlich Anwendungen, die ohne Kenntnis der Existenz dieser bestimmten Klasse geschrieben wurden. Daher ist Klassencode für einen bestimmten Objekttyp entweder in einer dynamischen verknüpften Bibliothek (DLL) oder in einer anderen ausführbaren Anwendung (EXE) vorhanden.

Jede COM-Klasse wird durch eine CLSID identifiziert, eine eindeutige 128-Bit-GUID, die der Server registrieren muss. COM verwendet diese CLSID auf Anforderung eines Clients, um der DLL oder EXE bestimmte Daten zuzuordnen, die den Code enthalten, der die Klasse implementiert, und erstellt so eine instance des Objekts.

Für Clients und Server auf demselben Computer ist die CLSID des Servers alles, was der Client jemals benötigt. Auf jedem Computer verwaltet COM eine Datenbank (es verwendet die Systemregistrierung auf Microsoft Windows- und Macintosh-Plattformen) aller CLSIDs für die auf dem System installierten Server. Dies ist eine Zuordnung zwischen jeder CLSID und dem Speicherort der DLL oder EXE, die den Code für diese CLSID enthält. COM konsultiert diese Datenbank immer dann, wenn ein Client eine instance einer COM-Klasse erstellen und seine Dienste verwenden möchte, sodass der Client nie den absoluten Speicherort des Codes auf dem Computer kennen muss.

Für verteilte Systeme stellt COM Registrierungseinträge bereit, die es einem Remoteserver ermöglichen, sich für die Verwendung durch einen Client zu registrieren. Während Anwendungen nur die CLSID eines Servers kennen müssen, da sie sich auf die Registrierung verlassen können, um den Server zu finden, ermöglicht COM Clients das Überschreiben von Registrierungseinträgen und das Angeben von Serverstandorten, um das Netzwerk in vollem Umfang zu nutzen. (Siehe Suchen eines Remoteobjekts.)

Die grundlegende Methode zum Erstellen eines instance einer Klasse ist ein COM-Klassenobjekt. Dies ist einfach ein Zwischenobjekt, das Funktionen unterstützt, die für das Erstellen neuer Instanzen einer bestimmten Klasse üblich sind. Die meisten Klassenobjekte, die zum Erstellen von Objekten aus einer CLSID verwendet werden, unterstützen die IClassFactory-Schnittstelle , eine Schnittstelle, die die wichtige CreateInstance-Methode enthält. Sie implementieren eine IClassFactory-Schnittstelle für jede Objektklasse, die Sie zum Instanziieren anbieten. (Weitere Informationen zum Implementieren von IClassFactory finden Sie unter Implementieren von IClassFactory.)

Hinweis

Server, die eine andere benutzerdefinierte Klassen factory-Schnittstelle unterstützen, müssen IClassFactory nicht speziell unterstützen. Aufrufe anderer Aktivierungsfunktionen als CoGetClassObject (z. B . CoCreateInstanceEx) erfordern jedoch, dass der Server IClassFactory unterstützt.

 

Wenn ein Client eine instance des Serverobjekts erstellen möchte, verwendet er die CLSID des gewünschten Objekts in einem Aufruf von CoGetClassObject. (Dieser Aufruf kann entweder direkt oder implizit über eine der Hilfsfunktionen zur Objekterstellung erfolgen.) Diese Funktion sucht den code, der der CLSID zugeordnet ist, erstellt ein Klassenobjekt und stellt einen Zeiger auf die angeforderte Schnittstelle bereit. (CoGetClassObject verwendet einen riid-Param , der den gewünschten Schnittstellenzeiger des Clients angibt.)

Hinweis

COM hat nur einige Funktionen, auf denen viele der anderen basieren. Die wichtigste davon ist wahrscheinlich CoGetClassObject, das allen instance Erstellungsfunktionen zugrunde liegt.

 

Mit diesem Zeiger kann der Aufrufer eine instance des Objekts erstellen und einen Zeiger auf eine angeforderte Schnittstelle für das Objekt abrufen. Dies ist in der Regel eine Initialisierungsschnittstelle, die verwendet wird, um das Objekt zu aktivieren (in den Ausführungszustand zu versetzen), sodass der Client die beliebige Arbeit mit dem Objekt ausführen kann, das er möchte. Unter Verwendung der grundlegenden Funktionen von COM muss der Client auch darauf achten, dass alle Objektzeiger freigegeben werden.

Ein weiterer Mechanismus zum Aktivieren von Objektinstanzen ist der Klassenmoniker. Klassenmoniker binden an das Klassenobjekt der Klasse, für die sie erstellt werden. Weitere Informationen finden Sie unter Klassenmoniker.

COM stellt mehrere Hilfsfunktionen bereit, die den Aufwand beim Erstellen von Objektinstanzen reduzieren. Diese werden unter Hilfsfunktionen für die Instanzerstellung beschrieben.

Erstellen eines Objekts über ein Klassenobjekt