虹裏専用ブラウザ 2B - トピック TOP >> Shell32::ShellFolderView のXPと7 について
2011/06/27
コモンダイアログの代わりにエクスプローラを使う方法について書いてみます.
Windows上の全てのウィンドウは SHDocVw::ShellBrowserWindow (IWebBrowser2) というCOMインタフェースで遠隔操作できます.
エクスプローラから ShellBrowserWindow を取得する方法は色々ありますが モニカを実行して探してもらうのが楽です.
VB6やVBAには GetObject という関数があるので {C08AFD90-F2A1-11D1-8455-00A0C91F3880} というCLISDを指定するとOK (CLISDは CLE Viewer で調べられます).
インタフェースが取得出来ましたら SHDocVw::ShellBrowserWindow::Document より Shell32::ShellFolderView というCOMクラスのインスタンスを取得出来ますが この Shell32::ShellFolderView こそがエクスプローラのフォルダ表示部を表すCOMクラスになります.
このインスタンスが取得出来ればあとは簡単.
Shell32::ShellFolderView::DefaultVerbInvoked でフォルダ・ファイルのダブルクリック
Shell32::ShellFolderView::VerbInvoked でフォルダ・ファイルのコピーとか削除(コンテキストメニュー)
をイベントとして2Bで受信できます.
Shell32::ShellFolderView::DefaultVerbInvoked の時に False を返してファイルの実行を中止し 2B にファイルパスを返せばOK.
しかし Shell32::ShellFolderView は XPと7でデフォルトインタフェースが異なります.
XPでは IShellFolderViewDual2 というインタフェースがデフォルトなのですが Vista/7 では IShellFolderViewDual3 がデフォルトで 3はフォルダのアイコン表示サイズ指定等 Vista で新しく追加されました.
なので 7 でコンパイルすると XP で動きません (型が違いと言われて オートメーションエラーになる).
逆に XP でコンパイルすると 7 で動きます.  なぜなら 32を継承しているからです.
7でコンパイルする場合は 2 へ落とさなければいけません.
しかし Shell32::ShellFolderView の定義は Shell32.DLL 内にある為 変更する事は出来ません.まー 変更出来ないのであれば 自前で定義すればいいのです.
[
uuid(62112AA1-EBE4-11CF-A5FB-0020AFE7292D),
helpstring("Shell Folder View Object (Windows XP Interface Default IShellFolderViewDual2)")
]
coclass ShellFolderView {
interface IShellFolderViewDual3;
[default] interface IShellFolderViewDual2;
[default, source] dispinterface DShellFolderViewEvents;
};
ってな感じ. ↑の定義も CLE Viewer で取れます. MKTYPLIB.EXE を使ってタイプライブラリを作成し VB6 で参照すれば終わり.
これで 7 でコンパイルしても XP で動きます.
2Bで実装してみた ソースを晒してみたり...
[edited 2011/08/07 22:36]