フォルダの切り替えExplorerBrowserに表示されたフォルダを選択した場合、デフォルトでは新しいウインドウが作成されてそこにフォルダの中身が表示されます。この動作を変更し、現在のウインドウにフォルダの中身を表示するためには、IExplorerBrowser::Adviseを呼び出す必要があります。*pdwCookie);psbeは、IExplorerBrowserEventsを実装したオブジェクトのアドレスを指定します。フォルダを切り替える場合には、このインターフェースを使用して通知が行われます。pdwCookieは、登録を識別する値を受け取る変数のアドレスを指定します。この値は登録を解除する際に必要になります。今回のプログラムは、フォルダの切り替えをExplorerBrowserの中で行っています。TRUE;}今回のCreateでは、IExplorerBrowser::Adviseを呼び出してオブジェクトを登録しています。CExplorerBrowserHostはIExplorerBrowserEventsを継承するようになっています。IExplorerBrowserEventsのメソッドは次に示す4つです。S_OK;}フォルダを切り替えようとすると、最初にOnNavigationPendingが呼ばれることになります。その後にOnNavigationCompleteが呼ばれます。新しいフォルダは表示されずOnNavigationFailedが呼ばれることになります。OnNavigationPendingではパスワードの入力を促すと面白いでしょう。入力されたパスワードが正しい場合にのみフォルダのアクセスを許可するわけです。これはメッセージループで使用されることになっています。{TranslateMessage(&msg);DispatchMessage(&msg);}}m_pShellViewがNULLでない場合は、IShellView::TranslateAcceleratorWを呼ぶようにしています。アクセラレータキーが押されていた場合はそれに準じた動作が行われます。Aが押されたならば、全てのアイテムが選択されることになります。新しいフォルダに切り替わっても前のフォルダに戻ることができます。そのボタンが押された場合に履歴情報を使用します。0;ID_BACKは「戻る」を意味するボタンのIDであり、これが押された場合はBrowseToIDListにSBSP_NAVIGATEBACKを指定します。これで前のフォルダを表示することができます。ID_FORWARDは「進む」を意味するボタンのIDであり、これが押された場合はSBSP_NAVIGATEFORWARDを指定します。履歴情報が存在しない場合はS_OKが返るだけで何も起こりません。ExplorerBrowserの問題点ExplorerBrowserが使用していて少し気になった点をいくつか紹介します。このメソッドには"戻ることが可能であるか"を調べるための定数はありません。ボタンは常に有効という状態になっています。OnNavigationPendingが呼ばれたかどうかで判定を行うことも不可能ではないかもしれません。これを試す場合は、BrowseToIDListが非同期(初回呼び出しは同期)に実行されるという点に注意してください。2つ目の問題点は、IUnknown_SetSiteとIExplorerBrowser::Adviseの両方を一緒に呼び出せないと言う点です。IExplorerBrowserEventsによる通知が行われるわけですが、それ以外の通知は一切行われないようになっています。前節で取り上げたIExplorerPaneVisibilityよる通知は行われません。そのようにすると今度はIExplorerBrowserEventsによる通知が行われないようになってしまいます。それ以外の通知を断念せざる得ないことになります。最後の問題点はExplorerBrowserというよりフォルダビューについてです。残念ながらこれを独自のメニューにすることはできないようです。このメソッドでは戻り値を通じてメニューの表示をキャンセルできません。メソッドが制御を返せば既定のメニューが表示されることになります。IShellView::GetItemObjectにSVGIO_SELECTIONを指定することで取得できます。残念ながら上手くいきませんでした。