たけです。
いつもお世話になっております。
COMの初期化、終了処理についてですが
どのタイミングで呼ぶべきでしょうか?
CoInitializeとCoUninitialize
を、COMをCoCreateInstanceする度に
呼んでも動くのでしょうが
アプリケーションを起動したときにCoInitializeして
終了するときにCoUninitializeした方が良い気もします。
また、この場合はアプリケーションクラス(CXXXApp)のコンストラクタ、デストラクタに
書くのが適当でしょうか?
ご教授下さい。
開発環境 VC6.0,Win2000
通常は、CWinApp::InitInstance()と
CWinApp::ExitInstance()で呼ぶのが良いと思います。
COMをアプリケーションの時々しか使わない一部の機能でのみ使うなら、
その機能の最初と最後で呼ぶのも良いかと思います。
確かなソースは持ち合わせていませんが、マルチスレッドの場合、
各スレッドごとに初期化・終了すべきだという話を聞いたことがあります。
パフォーマンスを気にしないなら、Initialize と Uninitialize の回数の対応さえ
きちんとしていれば、呼びすぎても問題はないと思います。
ご回答ありがとうございます。
>通常は、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されているのでエラー?)
> スレッド1 Initialize
> スレッド2 Initialize
> スレッド2 COM2処理
> スレッド2 Uninitialize ※
> スレッド1 COM1処理 (この時点でUninitializeされているのでエラー?)
※はあくまでスレッド2の Uninitialize なので、スレッド1には影響を及ぼさないも
のと思われ。
なるほど。
また、そのような理由から、スレッド毎に
初期化・終了するんでしょうね。