Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Ein COM-Server wird als COM-Klasse implementiert. Eine COM-Klasse ist eine Implementierung einer Gruppe von Schnittstellen im 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 trägt, 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 des Vorhandenseins 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 bestimmte Daten mit der DLL oder EXE zu verknüpfen, die den Code enthält, der die Klasse implementiert, wodurch eine Instanz des Objekts erstellt wird.
Für Clients und Server auf demselben Computer ist die CLSID des Servers alle Clientanforderungen. Auf jedem Computer verwaltet COM eine Datenbank (sie 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 der Position der DLL oder EXE, die den Code für diese CLSID enthält. COM konsultiert diese Datenbank, wenn ein Client eine Instanz einer COM-Klasse erstellen und seine Dienste verwenden möchte, sodass der Client niemals 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 zum Auffinden des Servers verlassen können, können Clients Registrierungseinträge außer Kraft setzen und Serverspeicherorte angeben, um das Netzwerk vollständig zu nutzen. (Siehe Suchen eines Remoteobjekts.)
Die grundlegende Möglichkeit zum Erstellen einer Instanz einer Klasse besteht aus einem COM-Klassenobjekt. Dies ist einfach ein Zwischenobjekt, das Funktionen unterstützt, die häufig zum Erstellen neuer Instanzen einer bestimmten Klasse verwendet werden. 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 instanziieren möchten. (Weitere Informationen zum Implementieren von IClassFactory-finden Sie unter Implementieren von IClassFactory.)
Anmerkung
Server, die eine andere benutzerdefinierte Klassenfactoryschnittstelle unterstützen, sind nicht erforderlich, um IClassFactory- speziell zu unterstützen. Aufrufe anderer Aktivierungsfunktionen als CoGetClassObject- (z. B. CoCreateInstanceEx) erfordern jedoch, dass der Server IClassFactory-unterstützt.
Wenn ein Client eine Instanz des Serverobjekts erstellen möchte, wird die CLSID des gewünschten Objekts in einem Aufruf von CoGetClassObjectverwendet. (Dieser Aufruf kann entweder direkt oder implizit sein, über eine der Hilfsfunktionen für die Objekterstellung.) Diese Funktion sucht den Code, der der CLSID zugeordnet ist, und erstellt ein Klassenobjekt und stellt einen Zeiger auf die angeforderte Schnittstelle bereit. (CoGetClassObject eine riid Param verwendet, die den gewünschten Schnittstellenzeiger des Clients angibt.)
Anmerkung
COM verfügt nur über einige Funktionen, auf denen viele der anderen aufgebaut sind. Die wichtigste davon ist wahrscheinlich CoGetClassObject, die allen Instanzenerstellungsfunktionen zugrunde liegt.
Mit diesem Zeiger kann der Aufrufer eine Instanz des Objekts erstellen und einen Zeiger auf eine angeforderte Schnittstelle des Objekts abrufen. Dies ist in der Regel eine Initialisierungsschnittstelle, die verwendet wird, um das Objekt zu aktivieren (in den ausgeführten Zustand zu setzen), damit der Client mit dem gewünschten Objekt arbeiten kann. Mithilfe der grundlegenden Funktionen von COM muss der Client auch alle Objektzeiger freigeben.
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 Class Monikers.
COM stellt mehrere Hilfsfunktionen bereit, die die Arbeit beim Erstellen von Objektinstanzen reduzieren. Diese werden in Hilfsfunktionen für die Instanzerstellungbeschrieben.
Verwandte Themen