COMの初期化、終了処理のタイミング

[戻る]
たけ 2004/11/18(木) 14:31:21
たけです。

いつもお世話になっております。

COMの初期化、終了処理についてですが
どのタイミングで呼ぶべきでしょうか?

CoInitializeとCoUninitialize
を、COMをCoCreateInstanceする度に
呼んでも動くのでしょうが

アプリケーションを起動したときにCoInitializeして
終了するときにCoUninitializeした方が良い気もします。
また、この場合はアプリケーションクラス(CXXXApp)のコンストラクタ、デストラクタに
書くのが適当でしょうか?

ご教授下さい。

開発環境 VC6.0,Win2000

dairygoods 2004/11/18(木) 16:27:00
通常は、CWinApp::InitInstance()と
CWinApp::ExitInstance()で呼ぶのが良いと思います。

COMをアプリケーションの時々しか使わない一部の機能でのみ使うなら、
その機能の最初と最後で呼ぶのも良いかと思います。

シャノン 2004/11/19(金) 09:52:04
確かなソースは持ち合わせていませんが、マルチスレッドの場合、
各スレッドごとに初期化・終了すべきだという話を聞いたことがあります。

パフォーマンスを気にしないなら、Initialize と Uninitialize の回数の対応さえ
きちんとしていれば、呼びすぎても問題はないと思います。

たけ 2004/11/19(金) 12:57:24
ご回答ありがとうございます。

>通常は、CWinApp::InitInstance()と
>CWinApp::ExitInstance()で呼ぶのが良いと思います。
>COMをアプリケーションの時々しか使わない一部の機能でのみ使うなら、
>その機能の最初と最後で呼ぶのも良いかと思います。
シングルスレッドですが、あちこちで使用する機能です。
ということで、CWinApp::InitInstance()、CWinApp::ExitInstance()にしようかなと思いま
す。

>確かなソースは持ち合わせていませんが、マルチスレッドの場合、
>各スレッドごとに初期化・終了すべきだという話を聞いたことがあります。
これははじめて聞きました。
でも、マルチスレッドでやると、以下のようにならないのでしょうか?

スレッド1
Initialize
COM1処理
Uninitialize

スレッド2
Initialize
COM2処理
Uninitialize

↑が同時に動いていて、
スレッド1 Initialize
スレッド2 Initialize
スレッド2 COM2処理
スレッド2 Uninitialize
スレッド1 COM1処理 (この時点でUninitializeされているのでエラー?)

シャノン 2004/11/19(金) 13:02:30
> スレッド1 Initialize
> スレッド2 Initialize
> スレッド2 COM2処理
> スレッド2 Uninitialize ※
> スレッド1 COM1処理 (この時点でUninitializeされているのでエラー?)

※はあくまでスレッド2の Uninitialize なので、スレッド1には影響を及ぼさないも
のと思われ。

たけ 2004/11/19(金) 13:27:25
なるほど。
また、そのような理由から、スレッド毎に
初期化・終了するんでしょうね。

古いスレッドには追加発言できません。