IFolderFilter
COM公式ドキュメント
サーバーアプリケーションによる Shell フォルダーの列挙を、クライアントがどのようにフィルターするかを指定するためにクライアントが公開するインターフェイスです。
解説(Remarks)
このインターフェイスは、フォルダー選択ダイアログボックスに表示されるツリービューの内容をフィルターするために、SHBrowseForFolder とともに使用されることが最も多いです。IFolderFilter を SHBrowseForFolder とともに使用するには、BIF_NEWDIALOGSTYLE フラグを設定する必要があります。
アプリケーションが SHBrowseForFolder を呼び出すと、フォルダーブラウザーオブジェクトのクライアントになります。フォルダーブラウザーオブジェクトは、コールバック関数 BrowseCallbackProc にメッセージを送信することで通信します。そのコールバック関数が処理する BFFM_IUNKNOWN メッセージには、フォルダーブラウザーの IUnknown インターフェイスへのポインターが含まれています。フォルダーの内容の表示をフィルターするには、次の手順を実行します。
- フォルダーブラウザーの QueryInterface メソッドを使用して、IFolderFilterSite インターフェイスへのポインターを要求します。
- IFolderFilterSite::SetFilter を呼び出し、IFolderFilter インターフェイスへのポインターを渡します。
- その後、フォルダーブラウザーは IFolderFilter::GetEnumFlags と IFolderFilter::ShouldShow に問い合わせて、列挙をどのようにフィルターするかを決定します。
メソッド 2
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
個々の項目をフィルターで通過させるか、ブロックするかを指定します。
| psf | IShellFolder* | in | フォルダーの IShellFolder インターフェイスへのポインター。 |
| pidlFolder | ITEMIDLIST* | in | フォルダーの PIDL。 |
| pidlItem | ITEMIDLIST* | in | 対象となる pidlFolder の子項目の相対 PIDL。 |
戻り値
解説(Remarks)
ホストは、psf または pidlFolder が参照するフォルダー内の各項目に対してこのメソッドを呼び出します。
実装では、psf と pidlItem の情報を、より扱いやすい IShellItem に変換することをお勧めします。次の例はこれを示しています。
STDMETHODIMP ShouldShow(IShellFolder *psf,
PCIDLIST_ABSOLUTE pidlFolder,
PCUITEMID_CHILD pidlItem)
{
IShellItem *psi;
HRESULT hr = SHCreateItemWithParent(NULL, psf, pidlItem, IID_PPV_ARGS(&psi));
if (SUCCEEDED(hr))
{
// Determine here whether the item should be shown. This determination
// is application-dependent.
psi->Release();
}
return hr;
}
Shell フォルダー内のどのクラスのオブジェクトを列挙するかをクライアントが指定できるようにします。SHBrowseForFolder とともに使用する場合、ダイアログボックスのツリービューに表示すべき項目のクラスと、表示すべきでないクラスを指定します。
| psf | IShellFolder* | in | フォルダーの IShellFolder インターフェイスへのポインター。 |
| pidlFolder | ITEMIDLIST* | in | フォルダーの PIDL。 |
| phwnd | HWND* | out | ホストのウィンドウハンドルへのポインター。 |
| pgrfFlags | DWORD* | inout | 列挙するオブジェクトのクラスを指定する 1 つ以上の SHCONTF 値。 |
戻り値
型: HRESULT
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IFolderFilter "{9CC22886-DC8E-11D2-B1D0-00C04F8EEB3E}" #usecom global IFolderFilter IID_IFolderFilter "{}" #comfunc global IFolderFilter_ShouldShow 3 sptr,var,var #comfunc global IFolderFilter_GetEnumFlags 4 sptr,var,sptr,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IFolderFilter "{9CC22886-DC8E-11D2-B1D0-00C04F8EEB3E}" #usecom global IFolderFilter IID_IFolderFilter "{}" #comfunc global IFolderFilter_ShouldShow 3 sptr,sptr,sptr #comfunc global IFolderFilter_GetEnumFlags 4 sptr,sptr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。