2013-11-09 9 views
6

in einem Thread, gibt es einen Unterschied, ob ichCoInitialize (nil) und CoInitializeEx (0, COINIT_MULTITHREADED) Differenz

Coinitialize(nil) 

anstelle von

CoInitializeEx(0, COINIT_MULTITHREADED); 

verwende ich Delphi 7, aber wahrscheinlich Die Frage kann für andere Programmiersprachen bleiben Danke für Ihre Hilfe.

+4

Haben Sie die Dokumentation auf 'CoInitialize'? –

+0

ja ich tat aber es ist nicht klar – user382591

+2

Vielleicht könnten Sie näher erläutern, auf welchem ​​Teil der Dokumentation Sie kämpfen. –

Antwort

11

Ersteres initialisiert COM auf eine Weise, die den aufrufenden Thread in einem eigenen single-threaded Apartment (STA) versetzt. Letzteres initialisiert COM auf eine Weise, die den aufrufenden Thread in einem freigegebenen Multithread-Apartment (MTA) platziert. Die beiden Apartments haben eine sehr unterschiedliche Semantik, insbesondere beim Zugriff auf COM-Objekte über Threadgrenzen hinweg. Threads in verschiedenen Apartments müssen Proxys für die gemeinsame Nutzung von COM-Objekten verwenden, aber COM stellt die Synchronisierung für Sie bereit (über Nachrichtenwarteschlangen pro Thread). Threads in derselben Wohnung können COM-Objekte ohne Proxies teilen, müssen sich jedoch manuell synchronisieren, z. B. mit kritischen Abschnitten oder Mutexen.

Also ja, es gibt einen Unterschied und es kann sehr bedeutsam sein. Bitte lesen Sie die Dokumentation auf MSDN, es ist sehr detailliert.

CoInitialize function

CoInitializeEx function

Processes, Threads, and Apartments