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
Feedback
https://aka.ms/ContentUserFeedback.
Bald verfügbar: Im Laufe des Jahres 2024 werden wir GitHub-Issues stufenweise als Feedbackmechanismus für Inhalte abbauen und durch ein neues Feedbacksystem ersetzen. Weitere Informationen finden Sie unterFeedback senden und anzeigen für