13

スレッドで、使用する場合に違いはありますか

Coinitialize(nil)

それ以外の

CoInitializeEx(0, COINIT_MULTITHREADED);

私は Delphi 7 を使用していますが、他のプログラミング言語についても疑問が残ると思います。ご協力ありがとうございます。

4

1 に答える 1

16

前者は、呼び出しスレッドを独自のシングル スレッド アパートメント (STA) に配置する方法で COM を初期化します。後者は、呼び出しスレッドを共有マルチスレッド アパートメント (MTA) に配置する方法で COM を初期化します。2 つのアパートメントは、特にスレッド境界を越えて COM オブジェクトにアクセスする方法において、セマンティクスが大きく異なります。異なるアパートメント内のスレッドはプロキシを使用して COM オブジェクトを共有する必要がありますが、COM は (スレッドごとのメッセージ キューを介して) 同期を提供します。同じアパートメント内のスレッドは、プロキシを使用せずに COM オブジェクトを共有できますが、クリティカル セクションやミューテックスなどを使用して手動で同期する必要があります。

そうです、違いがあり、それは非常に重要です。MSDN のドキュメントをお読みください。非常に詳細です。

CoInitialize 関数

CoInitializeEx 関数

プロセス、スレッド、およびアパートメント

于 2013-11-09T20:02:56.683 に答える