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 で動きます. なぜなら 3は2を継承しているからです.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で実装してみた ソースを晒してみたり...