Die COM-Bibliothek
Jeder Prozess, der COM verwendet, muss die COM-Bibliothek initialisieren und nicht initialisieren. Com ist nicht nur eine Spezifikation, sondern implementiert auch einige wichtige Dienste in dieser Bibliothek. Die COM-Bibliothek wird als Gruppe von DLLs und EXEs (hauptsächlich Ole32.dll und Rpcss.exe) in Microsoft Windows bereitgestellt und umfasst Folgendes:
Eine kleine Anzahl grundlegender Funktionen, die die Erstellung von COM-Anwendungen ermöglichen, sowohl client als auch server. Für Clients stellt COM grundlegende Funktionen zum Erstellen von Objekten zur Verfügung. Für Server bietet COM die Möglichkeit, ihre Objekte verfügbar zu machen.
Implementierungslocatordienste, über die COM anhand eines eindeutigen Klassenbezeichners (CLSID) bestimmt, welcher Server diese Klasse implementiert und wo sich dieser Server befindet. Dieser Dienst bietet Unterstützung für eine Deskriptionsebene, in der Regel eine Systemregistrierung, zwischen der Identität einer Objektklasse und der Paketierung der Implementierung, sodass Clients unabhängig von der Paketierung sind, was sich in Zukunft ändern kann.
Transparente Remoteprozeduraufrufe, wenn ein Objekt auf einem lokalen Oder Remoteserver ausgeführt wird.
Ein Standardmechanismus, mit dem eine Anwendung steuern kann, wie Arbeitsspeicher innerhalb des Prozesses zugeordnet wird, insbesondere Speicher, der zwischen den zwischenspeicherenden Objekten übergeben werden muss, damit er ordnungsgemäß frei werden kann.
Um grundlegende COM-Dienste zu verwenden, müssen alle COM-Ausführungsthreads auf Clients und Out-of-Process-Servern entweder die CoInitialize- oder die CoInitializeEx-Funktion aufrufen, bevor andere COM-Funktionen außer Speicherzuweisungsaufrufen aufrufen. CoInitializeEx ersetzt die andere Funktion und fügt einen Parameter hinzu, mit dem Sie das Threadingmodell des Threads angeben können: apartment-threaded oder free-threaded. Ein Aufruf von CoInitialize legt einfach das Threadingmodell auf apartment-threaded fest.
OLE-Verbunddokumentanwendungen rufen die OleInitialize-Funktion auf, die CoInitializeEx aufruft und auch initialisiert wird, die für Verbunddokumente erforderlich ist. Daher können Threads, die OleInitialize aufrufen, kein Freethreading sein. Informationen zum Threading auf Clients und Servern finden Sie unter Prozesse, Threads und Apartment.
Prozessin-Process-Server rufen die Initialisierungsfunktionen nicht auf, da sie in einen Prozess geladen werden, der dies bereits getan hat. Daher müssen Prozessserver ihr Threadingmodell in der Registrierung unter dem InprocServer32-Schlüssel festlegen. Ausführliche Informationen zu Threadingproblemen in Prozessservern finden Sie unter In-Process Server Threading Issues ( In-Process Server Threading Issues).
Es ist auch wichtig, die Initialisierung der Bibliothek zu entinitialisieren. Für jeden Aufruf von CoInitialize oder CoInitializeExmuss ein entsprechender Aufruf von CoUninitialize verwendet werden. Für jeden Aufruf von OleInitializemuss ein entsprechender Aufruf von OleUninitialize verwendet werden.
Prozessin-Process-Server können davon ausgehen, dass der Prozess, in den sie geladen werden, diese Schritte bereits ausgeführt hat.