SHBrowseForFolderを使ってフォルダを選択させるダイアログを表示させています。
改めてネットでSHBrowseForFolderを調べたところ、
この関数を使うにはCoInitializeExで
COMを初期化しておかなければならないと書いてあるページがありました。
実際にMSDNでSHBrowseForFolderの説明を見てみるとそう書いてある気がします。
(英語は苦手なので正しく読めてるか怪しいですが。汗)
しかしCOMの知識はほぼ皆無な状態で
検索をかけても参考になりそうなページが殆どなく、
CoInitializeExに関して何も判らない状態です。
いちおうCoInitializeExを呼ばなくても
正常に動作はするのですが何だか不安です。
SHBrowseForFolderを使うとき、
本当にCoInitializeExを呼ばなければならないのでしょうか?
また、本当にそうならどのように使えばいいのでしょうか?
現在は以下のコードでうまく動いてますが、
合ってるのかも間違ってるのかも判らない状態なので
その辺も合わせて教えてもらえたら嬉しいです。
//------------------------------------------------------
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
SHBrowseForFolder(&bi); //bi:BROWSEINFO構造体です。
CoUninitialize();
//------------------------------------------------------
環境 : WinXP VC++6.0
んっと・・・MFCを使っていたら・・・CoInitialize は、いらないかな~
使っていなかったらいるかな~
確か、OleInitialize で呼ばれてるはず
# 一応MSDNも確認したけど、OleInitialize か CoInitialize を呼べとあるので
# というか、両方呼ぶとおかしくなったような・・・?
すいません、書き忘れてました。MFCは使ってないです。
…ってことはやっぱり必要なんですね。
ありがとうございます。
訊いてばかりになってしまいますが、
呼出し方のほうは最初に書いたやつで大丈夫でしょうか?
(実際にこのように使っているコードを
見たことがなくて合っているか不安で。)
まぁ、別段問題ないと思うけど・・・
個人的には・・・
CoInitialize はアプリ起動時
CoUninitialize はアプリ終了時
のそれぞれ一回だけのがいいような?
うぎゃ。よく見たら
「通常一度だけ呼ばれる」(注:怪しい日本語訳)
って書いてありますね。
この関数は必要な関数の前に引数を変えて
何度でも呼び出すもんだと思いこんでました。
もっとよく見たら引数を変えて呼んじゃいけないようで(汗
これなら
> CoInitialize はアプリ起動時
> CoUninitialize はアプリ終了時
にも同感です。
これでいくことにします。
ありがとうございました!