いつもお世話になっております。
今回、Shell32::IShellFolderViewDualPtr を使用して
フォルダのパスを取得しているのですが、フォルダを
閉じるとエラーで強制終了してしまうバグが発生してしまいました。
開発環境はVisualStudio2008 C++ SDKのみです。
ソースを掲示します。
for(long i=0;i < sw->Count;++i){
if(ie = sw->Item(i)){
if(HWND(ie->HWND) == ::GetForegroundWindow()){
if(Shell32::IShellFolderViewDualPtr view = ie->GetDocument()){
Shell32::Folder2Ptr pFolder = view->Folder;
Shell32::FolderItemPtr pFolderItem = pFolder->Self;
_bstr_t sPath = pFolderItem->Path;
_stprintf(NowOpenDirectoryPath, _T("%s"), (LPCTSTR)sPath);
}
}
else{
ZeroMemory(NowOpenDirectoryPath,MAX_PATH);
break;
}
}
}
デバッグによると、ie->GetDocument()が失敗しているようなのですが・・・
ご教授よろしくお願いいたします。
> 閉じるとエラーで強制終了してしまうバグが発生してしまいました。
該当コードを try-catch で囲んでる?
IWebBrowser2::GetDocument() は、関数内部で呼んでいる IWebBrowser2::get_Document() が失敗すると例外を投げて知らせてくる。
なので、自分で例外を try-catch していない(OS に例外の処理を任した)場合…死ぬよ。
> else{
> ZeroMemory(NowOpenDirectoryPath,MAX_PATH);
> break;
> }
エクスプローラのウィンドウって複数開く事ができるよね。”フォルダ”を右クリック->「開く」等で。
ここで break しちゃうと SHDocVw::ShellWindows で2つ目以降に列挙されたエクスプローラがアクティブなケースに対応できないよn。
IE が立ち上がっているケースでも同様の問題(SHDocVw::ShellWindows は IE も列挙しちゃうので)が起きるかと。
gakさん
ご教授ありがとうございます。
ご指摘の通りtry-ccatchをしていなかったのが原因でした。
アクティブなウィンドウが列挙したものならそのパスを
違った場合デスクトップのパスを
何も列挙されない場合もデスクトップのパスを
という処理にしたいのですがうまくいかなくて困っています。
タイトルと違う質問になっていますが、ご教授の程よろしくお願いします。
> アクティブなウィンドウが列挙したものならそのパスを
> 違った場合デスクトップのパスを
> 何も列挙されない場合もデスクトップのパスを
デスクトップのパスの取得方法が判らないって事?
ならば、::SHGetFolderPath() に CSIDL_DESKTOP を指定すれば取れるんじゃね。
ツイート | ![]() |