Die COM-Bibliothek

Jeder Prozess, der COM verwendet, muss die COM-Bibliothek sowohl initialisieren als auch aufheben. Com ist nicht nur eine Spezifikation, er 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, sowohl Client als auch Server, erleichtern. Für Clients stellt COM grundlegende Funktionen zum Erstellen von Objekten bereit. Für Server stellt COM die Möglichkeit bereit, ihre Objekte verfügbar zu halten.

  • Implementierungslocatordienste, über die COM anhand eines eindeutigen Klassenbezeichners (CLSID) bestimmt, welcher Server diese Klasse implementiert und wo sich dieser Server befindet. Dieser Dienst umfasst unterstützung für eine Dereferenzierungsebene, in der Regel eine Systemregistrierung, zwischen der Identität einer Objektklasse und der Paketerstellung der Implementierung, sodass Clients unabhängig von der Paketerstellung 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 ihres Prozesses zugeordnet wird, insbesondere Arbeitsspeicher, der zwischen kooperierenden Objekten übergeben werden muss, damit er ordnungsgemäß freigegeben werden kann.

Um grundlegende COM-Dienste zu verwenden, müssen alle COM-Threads der Ausführung in Clients und Out-of-Process-Servern entweder die CoInitialize - oder die CoInitializeEx-Funktion aufrufen, bevor eine andere COM-Funktion außer Speicherbelegungsaufrufen aufgerufen wird. CoInitializeEx ersetzt die andere Funktion und fügt einen Parameter hinzu, mit dem Sie das Threadingmodell des Threads angeben können: entweder apartment-threaded oder free-threaded. Ein Aufruf von CoInitialize legt das Threadingmodell einfach auf Apartmentthreaded fest.

OLE-Verbunddokumentanwendungen rufen die OleInitialize-Funktion auf, die CoInitializeEx aufruft und auch einige Initialisierungen durchführt, die für Verbunddokumente erforderlich sind. Daher können Threads, die OleInitialize aufrufen, nicht free-threaded werden. Informationen zum Threading in Clients und Servern finden Sie unter Prozesse, Threads und Apartments.

Prozessinterne 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 Schlüssel InprocServer32 festlegen. Ausführliche Informationen zu Threadingproblemen in Prozessservern finden Sie unter Probleme beim In-Process-Serverthreading.

Es ist auch wichtig, die Bibliothek zu initialisieren. Für jeden Aufruf von CoInitialize oder CoInitializeEx muss ein entsprechender Aufruf von CoUninitialize vorhanden sein. Für jeden Aufruf von OleInitialize muss ein entsprechender Aufruf von OleUninitialize vorhanden sein.

Prozessinterne Server können davon ausgehen, dass der Prozess, in den sie geladen werden, diese Schritte bereits ausgeführt hat.

Das Component Object Model