2011-11-08 19 views
7

私は具体的には、のCoInitializeExに電話をかける:私のアプリケーションが作成されますが、そのアプリケーションが終了する前に終了したスレッドでアプリケーションが終了する前に終了するスレッドでCoUninitializeを呼び出すことは重要ですか?

CoInitializeEx(NULL, COINIT_DISABLE_OLE1DDE | COINIT_APARTMENTTHREADED); 

。これらをCoUninitialize呼び出しとペアにすることは重要ですか、またはスレッドが終了するとそれらのリソースが解放されますか?

+1

これを行うことが重要ではないにしても、なぜペアリングしませんか? –

+0

コードはすでにテスト中ですので、変更が無関係であれば変更しないでください。 – jeffm

答えて

14

リソースは通常、プロセスが終了するとシステムに戻されます。

しかし、CoUninitialize()は、リソースを解放してDLLをアンロードするだけでなく、スレッドが終了する前に残りのCOMメッセージをポンピングするためにモーダルメッセージループに入ります。ドキュメントは言う:

残りのオープンな会話がある場合は、CoUninitializeは モーダルメッセージループを開始し、このCOMアプリケーションの コンテナまたはサーバーからの保留中のメッセージを送出します。 メッセージを送信することによって、CoUninitializeは、保留中のすべてのメッセージを受信する前にアプリケーションが を終了しないことを保証します。非COMメッセージは が破棄されます。

したがって、呼び出し元の側のRPCエラーを回避するために、私はあなたがドキュメントのアドバイスに従うと、常にCoInitializeEx()と呼ばれているスレッドを終了する前にCoUninitialize()を呼び出すお勧めします。

関連する問題