フォルダからパスを抜き取り表示するプログラムでデバッグエラーが出ないようにするには


karasu  2011-01-22 00:11:23  No: 72201

いつもお世話になっております。
今回、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()が失敗しているようなのですが・・・

ご教授よろしくお願いいたします。


gak  2011-01-22 03:22:48  No: 72202

> 閉じるとエラーで強制終了してしまうバグが発生してしまいました。
該当コードを 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 も列挙しちゃうので)が起きるかと。


karasu  2011-01-25 14:37:36  No: 72203

gakさん
ご教授ありがとうございます。
ご指摘の通りtry-ccatchをしていなかったのが原因でした。

アクティブなウィンドウが列挙したものならそのパスを
違った場合デスクトップのパスを
何も列挙されない場合もデスクトップのパスを

という処理にしたいのですがうまくいかなくて困っています。

タイトルと違う質問になっていますが、ご教授の程よろしくお願いします。


gak  2011-01-26 03:02:57  No: 72204

> アクティブなウィンドウが列挙したものならそのパスを
> 違った場合デスクトップのパスを
> 何も列挙されない場合もデスクトップのパスを
デスクトップのパスの取得方法が判らないって事?
ならば、::SHGetFolderPath() に CSIDL_DESKTOP を指定すれば取れるんじゃね。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加