IShellBrowser
COM公式ドキュメント
Shell ビュー(IShellView を実装するオブジェクト)のホストによって実装されます。ホストしているビューや、Explorer ウィンドウのコンテキストで実行されるその他のオブジェクトに対してサービスを提供するメソッドを公開します。
解説(Remarks)
Windows エクスプローラーと ファイルを開く コモンダイアログボックスは、このインターフェイスの実装例です。これは、拡張機能によって公開される IShellView インターフェイスと対になるものです。
ブラウザーのサイトチェーンにアクセスできるオブジェクトは、IServiceProvider::QueryService を使用し、SID_STopLevelBrowser や SID_SCommDlgBrowser などのサービス ID を指定することで、IShellBrowser 上のブラウザーへの参照を取得できます。
Windows 7 以降。Windows エクスプローラーのコンテキストメニューは、サービス ID SID_SInPlaceBrowser を指定して IServiceProvider::QueryService を使用することで、インプレースナビゲーションをサポートできます。
メソッド 13
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
拡張された名前空間が表示または使用されているときに表示される複合メニューに、コンテナーが自身のメニューグループを挿入できるようにします。
| hmenuShared | HMENU | in | 空のメニューへのハンドル。 |
| lpMenuWidths | OLEMENUGROUPWIDTHS* | inout | 6 個の LONG 値からなる OLEMENUGROUPWIDTHS 配列のアドレス。コンテナーは、File、View、Window の各メニューグループに提供したメニュー要素の数を反映するために、要素 0、2、4 を埋めます。 |
戻り値
型: HRESULT
成功した場合は S_OK を返し、それ以外の場合は COM で定義されたエラー値を返します。
解説(Remarks)
このメソッドは IOleInPlaceFrame::InsertMenus メソッドに似ています。Windows エクスプローラーは、File メニューグループに File および Edit ドロップダウンメニューを、Container メニューグループに View および Tools メニューを、Window メニューグループに Help メニューを配置します。各ドロップダウンメニューには、FCIDM_MENU_FILE/EDIT/VIEW/TOOLS/HELP という一意の識別子が付けられます。ビューは、これらのサブメニューに識別子によってメニュー項目を挿入できます。これは OLE のインプレースアクティベーションの仕組みとは異なります。ビューが Windows エクスプローラーのサブメニューまたは自身のサブメニューに挿入するメニューのコマンド識別子は、FCIDM_SHVIEWFIRST から FCIDM_SHVIEWLAST の範囲でなければなりません。
呼び出し側アプリケーションへの注意
このメソッドは、名前空間拡張機能が最初にアクティブ化されるときに、フレームレベルのユーザーインターフェイスに自身のメニューを挿入するために呼び出されます。オブジェクトアプリケーションは、コンテナーに対して、hmenuShared パラメーターで指定されたメニューに自身のメニューを追加し、lpMenuWidths パラメーターが指す OLEMENUGROUPWIDTHS 配列にグループ数を設定するよう要求します。その後、オブジェクトアプリケーションは自身のメニューとカウントを追加します。オブジェクトは、複合メニューを構築するために必要な回数だけ IOleInPlaceFrame::InsertMenus メソッドを呼び出すことができます。コンテナーは、ドロップダウンメニュー内のすべての項目に対して、複合メニューに関連付けられた最初のメニューハンドルを使用する必要があります。
実装者への注意
IShellBrowser の実装では、メニュー識別子は FCIDM_BROWSERFIRST から FCIDM_BROWSERLAST の範囲でなければなりません。複合メニューをビューウィンドウにインストールします。
| hmenuShared | HMENU | in | IShellBrowser::InsertMenusSB および InsertMenu 関数の呼び出しによって構築された複合メニューへのハンドル。 |
| holemenuRes | INT_PTR | in | |
| hwndActiveObject | HWND | in | ビューのウィンドウハンドル。 |
戻り値
型: RESULT
成功した場合は S_OK を返し、それ以外の場合は COM で定義されたエラー値を返します。
解説(Remarks)
このメソッドは IOleInPlaceFrame::SetMenu メソッドに似ています。ただし、Windows エクスプローラーはメニュー項目識別子に基づいてメニューのディスパッチを行います。
特定のメニュー項目が利用可能かどうかは、ビューがフォーカスを持っているかどうかに依存します。したがって、ビューウィンドウ(またはその子ウィンドウの 1 つ)がフォーカスを持つたびに、IShellBrowser::OnViewWindowActive メソッドを呼び出す必要があります。
呼び出し側アプリケーションへの注意
オブジェクトは IShellBrowser_SetMenuSB を呼び出して、IShellBrowser::InsertMenusSB の呼び出しによって設定された複合メニュー構造をインストールするようコンテナーに要求します。実装者への注意
コンテナーによるこのメソッドの実装では、SetMenu 関数を呼び出す必要があります。コンテナーが、インプレース複合メニューから自身のメニュー要素を削除し、関連するすべてのリソースを解放できるようにします。
| hmenuShared | HMENU | in | IShellBrowser::InsertMenusSB および InsertMenu 関数の呼び出しによって構築されたインプレース複合メニューへのハンドル。 |
戻り値
型: HRESULT
成功した場合は S_OK を返し、それ以外の場合は COM で定義されたエラー値を返します。
解説(Remarks)
このメソッドは IOleInPlaceFrame::RemoveMenus メソッドに似ています。
オブジェクトは、共有ユーザーインターフェイスを非アクティブ化する前に、コンテナーが複合メニューから自身のメニュー要素を削除できるよう常に許可する必要があります。
呼び出し側アプリケーションへの注意
このメソッドは、オブジェクトアプリケーションが UI 非アクティブ化されている間に呼び出され、ブラウザーが自身のメニューを削除できるようにします。コンテナーのフレームウィンドウのステータスバーに、インプレースオブジェクトに関するステータステキストを設定して表示します。
| pszStatusText | LPWSTR | in | 表示するメッセージを含む null 終端文字列へのポインター。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
IShellBrowser::SendControlMsg メソッドを使用して、ステータスウィンドウに直接メッセージを送信することもできます。
呼び出し側アプリケーションへの注意
ステータスバーの内容を設定するには、このメソッドを使用します。Windows エクスプローラーに対して、モードレスダイアログボックスを有効または無効にするよう指示します。
| fEnable | BOOL | in | モードレスダイアログボックスを有効にするか無効にするかを指定します。このパラメーターが 0 以外の場合、モードレスダイアログボックスが有効になります。このパラメーターが 0 の場合、モードレスダイアログボックスは無効になります。 |
戻り値
型: HRESULT
成功した場合は S_OK を返し、それ以外の場合は COM で定義されたエラー値を返します。
解説(Remarks)
このメソッドは IOleInPlaceFrame::EnableModeless メソッドに似ています。現在のバージョンの Windows エクスプローラーにはモードレスダイアログボックスはありませんが、ビューは Windows エクスプローラーウィンドウに関連付けられたモードレスダイアログボックスを無効または有効にしたいときに、このメソッドを呼び出す必要があります。
ビューがアクティブな間に、ブラウザーのフレーム宛てのアクセラレーターキーストロークを変換します。
| pmsg | MSG* | in | キーストロークメッセージを含む MSG 構造体のアドレス。 |
| wID | WORD | in | コンテナーが提供するアクセラレーターテーブル内で、キーストロークに対応するコマンド識別子の値。コンテナーは、再度変換するのではなく、この値を使用する必要があります。 |
戻り値
型: HRESULT
成功した場合は S_OK を返し、それ以外の場合は COM で定義されたエラー値を返します。
解説(Remarks)
このメソッドは IOleInPlaceFrame::TranslateAccelerator メソッドに似ています。
別のフォルダーへ移動するよう Windows エクスプローラーに指示します。
| pidl | ITEMIDLIST* | in | オブジェクトの場所を指定する ITEMIDLIST(アイテム識別子リスト)構造体のアドレス。この値は、wFlags パラメーターに設定されたフラグに依存します。 |
| wFlags | DWORD | in | 移動先のフォルダーを指定するフラグ。0、または次の値の 1 つ以上を指定できます。 これらのフラグは、別のウィンドウを作成するかどうかを指定します。 SBSP_DEFBROWSER (0x0000)ビューオプション(新しいウィンドウを作成するか、その場で参照するかというユーザー設定)を尊重する既定の動作を使用します。ほとんどの場合、呼び出し側アプリケーションはこのフラグを使用してください。 SBSP_SAMEBROWSER同じ Windows エクスプローラーウィンドウで別のフォルダーへ移動します。 SBSP_NEWBROWSER指定したフォルダー用に別のウィンドウを作成します。 次のフラグはモードを指定します。SBSP_SAMEBROWSER が指定されている場合、または SBSP_DEFBROWSER が指定されていてユーザーが その場で参照する を選択している場合、これらの値は無視されます。 SBSP_DEFMODE現在のウィンドウを使用します。 SBSP_OPENMODE新しい参照ウィンドウにフォルダーツリーを表示しないよう指定します。現在のブラウザーが参照オブジェクト呼び出しの SBSP_OPENMODE と一致しない場合、新しいウィンドウが開かれます。 SBSP_EXPLOREMODE新しい参照ウィンドウにフォルダーツリーを表示するよう指定します。現在のブラウザーが参照オブジェクト呼び出しの SBSP_EXPLOREMODE と一致しない場合、新しいウィンドウが開かれます。 SBSP_HELPMODEサポートされていません。使用しないでください。 SBSP_NOTRANSFERHIST参照履歴を新しいウィンドウに転送しません。 次のフラグは pidl パラメーターのカテゴリを指定します。 SBSP_ABSOLUTEデスクトップを基準とする絶対 PIDL。 SBSP_RELATIVE現在のフォルダーを基準とする相対 PIDL。 SBSP_PARENT親フォルダーを参照し、PIDL を無視します。 SBSP_NAVIGATEBACK後方へ移動し、PIDL を無視します。 SBSP_NAVIGATEFORWARD前方へ移動し、PIDL を無視します。 SBSP_ALLOW_AUTONAVIGATE (0x00010000)自動ナビゲーションを有効にします。 次のフラグはモードを指定します。 SBSP_KEEPSAMETEMPLATE (0x00020000)Windows Vista 以降。サポートされていません。使用しないでください。 SBSP_KEEPWORDWHEELTEXT (0x00040000)Windows Vista 以降。検索入力フィールドをクリアせずに移動します。 SBSP_ACTIVATE_NOFOCUS (0x00080000)Windows Vista 以降。新しいビューにフォーカスを設定する既定の動作を行わずに移動します。 次のフラグは、ナビゲーションの結果として履歴がどのように操作されるかを制御します。 SBSP_CALLERUNTRUSTED (0x00800000)Microsoft Internet Explorer 6 Service Pack 2 (SP2) 以降。ナビゲーションは、ローカルシステム上に既に存在するスクリプトコードを持つ Web ページによって開始された可能性があります。 SBSP_TRUSTFIRSTDOWNLOAD (0x01000000)Microsoft Internet Explorer 6 Service Pack 2 (SP2) 以降。新しいウィンドウはユーザーが開始したアクションの結果です。新しいウィンドウが直ちにコンテンツのダウンロードを試みる場合、そのウィンドウを信頼します。 SBSP_UNTRUSTEDFORDOWNLOAD (0x02000000)Microsoft Internet Explorer 6 Service Pack 2 (SP2) 以降。ウィンドウは、信頼されていない非 HTML ファイルへ移動しています。ユーザーがファイルのダウンロードを試みても、ダウンロードを許可しないでください。 SBSP_NOAUTOSELECT履歴ペインでの選択を抑制します。 SBSP_WRITENOHISTORYこのナビゲーションの履歴を、履歴 Shell フォルダーに書き込みません。 SBSP_CREATENOHISTORY (0x00100000)0x00100000。Windows 7 以降。トラベルログに新しいエントリを追加しません。ユーザーが検索ボックスに検索語を入力し、その後クエリを絞り込むと、ブラウザーは前方へ移動しますが、トラベルログエントリを追加しません。 SBSP_TRUSTEDFORACTIVEX (0x10000000)Microsoft Internet Explorer 6 Service Pack 2 (SP2) 以降。ナビゲーションで ActiveX のプロンプトを許可します。 SBSP_FEEDNAVIGATION (0x20000000)Windows Internet Explorer 7 以降。現在のレジストリ設定で許可されている場合、ブラウザーに移動先を与えます。 SBSP_REDIRECT (0x40000000)別の URL へのリダイレクトを有効にします。 SBSP_INITIATEDBYHLINKFRAME (0x80000000)SBSP_PLAYNOSOUND (0x00200000)Windows 7 以降。検索ボックスでのキーストロークごとにナビゲーション完了音を鳴らしません。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
ビューはこのメソッドを使用して、名前空間内の特定の場所へ移動するよう Windows エクスプローラーに強制できます。通常、これらはビューに含まれるフォルダーです。
例
IShellBrowser* psb;
hr = IUnknown_QueryService(punkSite, SID_STopLevelBrowser, IID_PPV_ARGS(&psb));
if (SUCCEEDED(hr))
{
hr = psb->BrowseObject(pidlSearch, SBSP_DEFBROWSER | SBSP_ABSOLUTE);
psb->Release();
}
ビュー固有の状態情報を格納するために使用できる IStream インターフェイスを取得します。
| grfMode | DWORD | in | IStream インターフェイスの読み取り/書き込みアクセス。次のいずれかの値を指定できます。 STGM_READ読み取りに適した IStream を要求します。 STGM_WRITE書き込みに適した IStream を要求します。 STGM_READWRITE読み取りと書き込みに適した IStream を要求します。 |
| ppStrm | IStream** | out | IStream インターフェイスポインターを受け取るアドレス。 |
戻り値
型: HRESULT
成功した場合は S_OK を返し、それ以外の場合は COM で定義されたエラー値を返します。
解説(Remarks)
このメソッドは、ビューの永続的な状態(たとえば、アイコンの位置、列の幅、現在のスクロール位置など)を保存および復元するために使用されます。
呼び出し側アプリケーションへの注意
ビューが作成されるときに保存されたビュー状態を読み込むため、およびビューが閉じられるときにビュー状態への変更を保存するために、GetViewStateStream を使用します。通常、ビューはビューウィンドウを作成するときに STGM_READ を指定して、また IShellView インターフェイスの SaveViewState メソッドが呼び出されるときに STGM_WRITE を指定して、このメソッドを呼び出します。実装者への注意
各 Shell ビューは、独自のビューストリームを持つ必要があります。Windows エクスプローラーは、ユーザーごとにレジストリに格納されるビューストリームの最近使用した項目(MRU)リストを実装しています。IShellBrowser も参照してください。
ブラウザーコントロールへのウィンドウハンドルを取得します。
| id | DWORD | in | 要求するコントロールハンドル。このパラメーターには次のいずれかの値を指定できます。 FCW_TOOLBARブラウザーのツールバーへのウィンドウハンドルを取得します。 FCW_STATUSブラウザーのステータスバーへのウィンドウハンドルを取得します。 FCW_TREEブラウザーのツリービューへのウィンドウハンドルを取得します。 FCW_PROGRESSブラウザーのプログレスバーへのウィンドウハンドルを取得します。 |
| phwnd | HWND* | out | Windows エクスプローラーコントロールへのウィンドウハンドルのアドレス。 |
戻り値
型: HRESULT
成功した場合は S_OK を返し、それ以外の場合は COM で定義されたエラー値を返します。
解説(Remarks)
GetControlWindow は、ビューがブラウザーのコントロールを直接操作できるように使用されます。FCW_TREE は、ツリーが存在するかどうかを判定するためだけに使用してください。
呼び出し側アプリケーションへの注意
GetControlWindow は、コントロールウィンドウの状態を操作およびテストするために使用されます。これらのコントロールに直接メッセージを送信しないでください。代わりに IShellBrowser::SendControlMsg を使用してください。このメソッドが NULL を返す場合に備えてください。後のバージョンの Windows エクスプローラーには、ツールバー、ステータスバー、ツリーウィンドウが含まれない可能性があります。実装者への注意
GetControlWindow は、実装内にこれらのコントロールが存在する場合、それらへのウィンドウハンドルを返します。IShellBrowser も参照してください。
Windows エクスプローラーウィンドウのツールバーまたはステータスバーに制御メッセージを送信します。
| id | DWORD | in | ツールバー(FCW_TOOLBAR)またはステータスバーウィンドウ(FCW_STATUS)のいずれかの識別子。 |
| uMsg | DWORD | in | コントロールに送信するメッセージ。 |
| wParam | WPARAM | in | 値は uMsg パラメーターで指定されたメッセージに依存します。 |
| lParam | LPARAM | in | 値は uMsg パラメーターで指定されたメッセージに依存します。 |
| pret | LRESULT* | outoptional | |
戻り値
型: HRESULT
成功した場合は S_OK を返し、それ以外の場合は COM で定義されたエラー値を返します。
解説(Remarks)
ツールバーまたはステータスバーコントロールに送信できるメッセージの詳細については、コモンコントロール のドキュメントを参照してください。
呼び出し側アプリケーションへの注意
この呼び出しの使用には細心の注意が必要です。ステータスバーまたはツールバーを不適切な状態のままにすると、Windows エクスプローラーのパフォーマンスに影響します。実装者への注意
お使いの Windows エクスプローラーにこれらのコントロールがない場合は、E_NOTIMPL を返すことができます。現在アクティブな(表示されている)Shell ビューオブジェクトを取得します。
| ppshv | IShellView** | out | 現在アクティブな Shell ビューオブジェクトへのポインターのアドレス。 |
戻り値
型: HRESULT
成功した場合は S_OK を返し、それ以外の場合は COM で定義されたエラー値を返します。
解説(Remarks)
呼び出し側アプリケーションへの注意
IShellBrowser インターフェイスは複数の Shell ビューを同時にホストできるため、このメソッドはアクティブな Shell ビューオブジェクトを判定する簡単な方法を提供します。ビューウィンドウまたはその子ウィンドウの 1 つがフォーカスを取得したとき、またはアクティブになったときに、Shell ビューによって呼び出されます。
| pshv | IShellView* | in | ビューオブジェクトの IShellView ポインターのアドレス。 |
戻り値
型: HRESULT
成功した場合は S_OK を返し、それ以外の場合は COM で定義されたエラー値を返します。
解説(Remarks)
現在のバージョンの Windows エクスプローラーはこのパラメーターを使用しませんが、ビューは自身の IShellView 実装をこのルーチンに渡す必要があります。
呼び出し側への注意
Shell ビューオブジェクトは、IShellBrowser::InsertMenusSB メソッドを呼び出す前に、このメソッドを呼び出す必要があります。このメソッドは、ビューがフォーカスを持っているかどうかに応じて、異なるメニュー項目のセットを挿入します。実装者への注意
このメソッドは、ビューがフォーカスを取得していること(たとえば、ビュー上でマウスがクリックされたとき)をブラウザーに通知します。Windows エクスプローラーのツールバーにツールバー項目を追加します。
| lpButtons | TBBUTTON* | inoptional | TBBUTTON 構造体の配列のアドレス。 |
| nButtons | DWORD | in | lpButtons 配列内の TBBUTTON 構造体の数。 |
| uFlags | DWORD | in | ツールバーボタンを配置する場所を指定するフラグ。このパラメーターには次の値の 1 つ以上を指定できます。 FCT_ADDTOENDツールバーの右側に追加します。 FCT_CONFIGABLE実装されていません。 FCT_MERGEすべてのボタンをビューが提供するものに置き換えるのではなく、ツールバー項目をマージします。これが推奨される選択肢です。 |
戻り値
型: HRESULT
成功した場合は S_OK を返し、それ以外の場合は COM で定義されたエラー値を返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IShellBrowser "{000214E2-0000-0000-C000-000000000046}" #usecom global IShellBrowser IID_IShellBrowser "{}" #comfunc global IShellBrowser_InsertMenusSB 5 sptr,var #comfunc global IShellBrowser_SetMenuSB 6 sptr,sptr,sptr #comfunc global IShellBrowser_RemoveMenusSB 7 sptr #comfunc global IShellBrowser_SetStatusTextSB 8 wstr #comfunc global IShellBrowser_EnableModelessSB 9 int #comfunc global IShellBrowser_TranslateAcceleratorSB 10 var,int #comfunc global IShellBrowser_BrowseObject 11 var,int #comfunc global IShellBrowser_GetViewStateStream 12 int,sptr #comfunc global IShellBrowser_GetControlWindow 13 int,sptr #comfunc global IShellBrowser_SendControlMsg 14 int,int,sptr,sptr,var #comfunc global IShellBrowser_QueryActiveShellView 15 sptr #comfunc global IShellBrowser_OnViewWindowActive 16 sptr #comfunc global IShellBrowser_SetToolbarItems 17 var,int,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IShellBrowser "{000214E2-0000-0000-C000-000000000046}" #usecom global IShellBrowser IID_IShellBrowser "{}" #comfunc global IShellBrowser_InsertMenusSB 5 sptr,sptr #comfunc global IShellBrowser_SetMenuSB 6 sptr,sptr,sptr #comfunc global IShellBrowser_RemoveMenusSB 7 sptr #comfunc global IShellBrowser_SetStatusTextSB 8 wstr #comfunc global IShellBrowser_EnableModelessSB 9 int #comfunc global IShellBrowser_TranslateAcceleratorSB 10 sptr,int #comfunc global IShellBrowser_BrowseObject 11 sptr,int #comfunc global IShellBrowser_GetViewStateStream 12 int,sptr #comfunc global IShellBrowser_GetControlWindow 13 int,sptr #comfunc global IShellBrowser_SendControlMsg 14 int,int,sptr,sptr,sptr #comfunc global IShellBrowser_QueryActiveShellView 15 sptr #comfunc global IShellBrowser_OnViewWindowActive 16 sptr #comfunc global IShellBrowser_SetToolbarItems 17 sptr,int,int ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。