Initialisieren der COM-Bibliothek

Jedes Windows-Programm, das COM verwendet, muss die COM-Bibliothek initialisieren, indem die CoInitializeEx-Funktion aufgerufen wird. Jeder Thread, der eine COM-Schnittstelle verwendet, muss einen separaten Aufruf dieser Funktion ausführen. CoInitializeEx weist die folgende Signatur auf:

HRESULT CoInitializeEx(LPVOID pvReserved, DWORD dwCoInit);

Der erste Parameter ist reserviert und muss NULL sein. Der zweite Parameter gibt das Threadingmodell an, das Ihr Programm verwendet. COM unterstützt zwei verschiedene Threadingmodelle: Apartmentthread undMultithread. Wenn Sie Apartmentthreading angeben, geben Sie die folgenden Garantien:

  • Sie greifen über einen einzelnen Thread auf jedes COM-Objekt zu. Sie werden keine COM-Schnittstellenzeiger zwischen mehreren Threads freigeben.
  • Der Thread verfügt über eine Nachrichtenschleife. (Siehe Fenstermeldungen in Modul 1.)

Wenn eine dieser Einschränkungen nicht zutrifft, verwenden Sie das Multithreadmodell. Um das Threadingmodell anzugeben, legen Sie eines der folgenden Flags im dwCoInit-Parameter fest.

Flag Beschreibung
COINIT_APARTMENTTHREADED Apartmentthreads.
COINIT_MULTITHREADED Multithreaded.

 

Sie müssen genau eines dieser Flags festlegen. Im Allgemeinen sollte ein Thread, der ein Fenster erstellt, das flag COINIT_APARTMENTTHREADED verwenden, und andere Threads sollten COINIT_MULTITHREADED verwenden. Einige COM-Komponenten erfordern jedoch ein bestimmtes Threadingmodell. Wann dies der Fall ist, sollten Sie in der MSDN-Dokumentation informieren.

Hinweis

Selbst wenn Sie Apartmentthreading angeben, ist es immer noch möglich, Schnittstellen zwischen Threads gemeinsam zu nutzen, indem eine Technik namens Marshalling verwendet wird. Marshalling liegt außerhalb des Rahmens dieses Moduls. Der wichtige Punkt ist, dass Sie beim Apartmentthreading niemals einfach einen Schnittstellenzeiger auf einen anderen Thread kopieren dürfen. Weitere Informationen zu den COM-Threadingmodellen finden Sie unter Prozesse, Threads und Apartments.

 

Zusätzlich zu den bereits erwähnten Flags empfiehlt es sich, das COINIT_DISABLE_OLE1DDE-Flag im dwCoInit-Parameter festzulegen. Das Festlegen dieses Flags vermeidet zusätzlichen Aufwand, der mit ole 1.0 (Object Linking and Embedding, OLE) 1.0, einer veralteten Technologie, verbunden ist.

So initialisieren Sie COM für Apartmentthreading:

HRESULT hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED | COINIT_DISABLE_OLE1DDE);

Der HRESULT-Rückgabetyp enthält einen Fehler- oder Erfolgscode. Im nächsten Abschnitt wird die BEHANDLUNG von COM-Fehlern behandelt.

Aufheben der Initialisierung der COM-Bibliothek

Für jeden erfolgreichen Aufruf von CoInitializeEx müssen Sie CoUninitialize aufrufen, bevor der Thread beendet wird. Diese Funktion akzeptiert keine Parameter und verfügt über keinen Rückgabewert.

CoUninitialize();

Nächste

Fehlercodes in COM