エクスプローラのアドレスのパスを取得するには?

解決


yng  2010-06-10 19:57:52  No: 71724  IP: 192.*.*.*

初めまして。
VC++でシェルエクステンションを作成しています。コンテキストメニューから呼ばれてInvokeCommandあたりで現在のアドレスのパスを取得したいのですが方法が分かりません。(選択しているファイルやフォルダのパスではありません)
どなたかご教授願います。

編集 削除
aetos  2010-06-10 21:00:22  No: 71725  IP: 192.*.*.*

つまり取得したいのは、コンテキストメニューを出しているそのアイテムの親フォルダのパスということでいいですか?
それなら、IShellExtInit::Initialize の第1引数の LPITEMIDLIST が親フォルダを指していると思うので、そこから取れると思います。

アドレスバーの文字列は IShellFolder::GetDisplayNameOf に SHGDN_FORADDRESSBAR を渡してやれば取れると思います(Win7 以降でどうなるかわかりませんが…)。
あとはどこから IShellFolder を得るかですが…SHGetDesktopFolder でいけるかなぁ?

試してないので確証がありません。ごめんなさい。

編集 削除
yng  2010-06-11 10:16:01  No: 71726  IP: 192.*.*.*

aetos さん、ありがとうございます。

まず、
>IShellExtInit::Initialize の第1引数の LPITEMIDLIST
を試してみましたが、どうもnullが来ているようでうまく
取得できませんでした。

char c[256];
if(pIDFolder){
  SHGetPathFromIDList(pIDFolder, c);
  MessageBox(NULL, c, "Address", MB_OK);
}

もうひとつの
>IShellFolder::GetDisplayNameOf に SHGDN_FORADDRESSBAR
の件はまだ試せていませんが、できれば最初の方法のような
手法でやりたいですね。
私は最初、GetCurrentDirectory() で取得しようとしたら、これで
取得できるのは作業ディレクトリなんですよね。エクスプローラが
表示しているフォルダはアドレスからの文字列を取得するしかない
のでしょうか。

編集 削除
aetos  2010-06-11 16:11:34  No: 71727  IP: 192.*.*.*

> どうもnullが来ているようで

とは、どのように確認しましたか?
メッセージボックスが出なかったのでしょうか?

SHGetPathFromIDList で取得できるのはファイルシステム上のファイルやディレクトリだけで、コントロールパネルのようなファイルとしての実態を持たないオブジェクトでは何も返しませんが、ファイルシステムオブジェクトで実験しましたか?

> IShellFolder::GetDisplayNameOf に SHGDN_FORADDRESSBAR

はもう一つの方法ではなく、その前の方と組み合わせて使うことを意図しています(つまり、SHGetPathFromIDList は使わないということです)。

編集 削除
yng  2010-06-23 19:00:41  No: 71728  IP: 192.*.*.*

返事が遅くなりました。

>とは、どのように確認しましたか?
>メッセージボックスが出なかったのでしょうか?

確認の仕方が悪かったのか分からないですがうまくとれるようになりました。
pidlFolderにはちゃんと値が入っています。ただ仮想フォルダは駄目なんですね。

ありがとうございました。

編集 削除