Win32 API 日本語リファレンス
ホームUI.Shell › IFolderFilter

IFolderFilter

COM
IID9cc22886-dc8e-11d2-b1d0-00c04f8eeb3e継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

サーバーアプリケーションによる Shell フォルダーの列挙を、クライアントがどのようにフィルターするかを指定するためにクライアントが公開するインターフェイスです。

解説(Remarks)

このインターフェイスは、フォルダー選択ダイアログボックスに表示されるツリービューの内容をフィルターするために、SHBrowseForFolder とともに使用されることが最も多いです。IFolderFilterSHBrowseForFolder とともに使用するには、BIF_NEWDIALOGSTYLE フラグを設定する必要があります。

アプリケーションが SHBrowseForFolder を呼び出すと、フォルダーブラウザーオブジェクトのクライアントになります。フォルダーブラウザーオブジェクトは、コールバック関数 BrowseCallbackProc にメッセージを送信することで通信します。そのコールバック関数が処理する BFFM_IUNKNOWN メッセージには、フォルダーブラウザーの IUnknown インターフェイスへのポインターが含まれています。フォルダーの内容の表示をフィルターするには、次の手順を実行します。

  1. フォルダーブラウザーの QueryInterface メソッドを使用して、IFolderFilterSite インターフェイスへのポインターを要求します。
  2. IFolderFilterSite::SetFilter を呼び出し、IFolderFilter インターフェイスへのポインターを渡します。
  3. その後、フォルダーブラウザーは IFolderFilter::GetEnumFlagsIFolderFilter::ShouldShow に問い合わせて、列挙をどのようにフィルターするかを決定します。

メソッド 2

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT ShouldShow(IShellFolder* psf, ITEMIDLIST* pidlFolder, ITEMIDLIST* pidlItem)

個々の項目をフィルターで通過させるか、ブロックするかを指定します。

psfIShellFolder*inフォルダーの IShellFolder インターフェイスへのポインター。
pidlFolderITEMIDLIST*inフォルダーの PIDL。
pidlItemITEMIDLIST*in対象となる pidlFolder の子項目の相対 PIDL。

戻り値

型: HRESULT

項目を表示すべき場合は S_OK、表示すべきでない場合は S_FALSE、エラーが発生した場合は標準的なエラーコードを返します。エラーが発生した場合、その項目は表示されません。

解説(Remarks)

ホストは、psf または pidlFolder が参照するフォルダー内の各項目に対してこのメソッドを呼び出します。

実装では、psfpidlItem の情報を、より扱いやすい 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;
}
vtbl 4 HRESULT GetEnumFlags(IShellFolder* psf, ITEMIDLIST* pidlFolder, HWND* phwnd, DWORD* pgrfFlags)

Shell フォルダー内のどのクラスのオブジェクトを列挙するかをクライアントが指定できるようにします。SHBrowseForFolder とともに使用する場合、ダイアログボックスのツリービューに表示すべき項目のクラスと、表示すべきでないクラスを指定します。

psfIShellFolder*inフォルダーの IShellFolder インターフェイスへのポインター。
pidlFolderITEMIDLIST*inフォルダーの PIDL。
phwndHWND*outホストのウィンドウハンドルへのポインター。
pgrfFlagsDWORD*inout列挙するオブジェクトのクラスを指定する 1 つ以上の SHCONTF 値。

戻り値

型: HRESULT

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 指定が可能。