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

IColumnProvider

COM
IIDe8025004-1c42-11d2-be2c-00a0c9a83da1継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

Windows エクスプローラーの詳細表示にカスタム列を追加できるメソッドを公開します。

解説(Remarks)

Windows エクスプローラーの詳細表示は、通常いくつかの標準的な列を表示します。各列には、現在のフォルダー内の各ファイルについて、ファイルサイズや種類などの情報が一覧表示されます。また、ユーザーが表示を選択できる列も複数存在します。ユーザーが列見出しの1つを右クリックすると、利用可能な列の一覧がダイアログボックスに表示されます。IColumnProvider インターフェイスをエクスポートする列プロバイダーオブジェクトを作成することで、そのダイアログボックスにカスタム列を追加し、Windows エクスプローラーで表示させることができます。たとえば、音楽を含む一連のファイルは、列プロバイダーを使用して、各ファイルに含まれるアーティストや楽曲を列挙する列を表示できます。

列プロバイダーはグローバルオブジェクトであり、Windows エクスプローラーが詳細表示を表示するたびに呼び出されます。Windows エクスプローラーは、登録されているすべての列プロバイダーに対してその列の特性を問い合わせます。ユーザーが列プロバイダーの列の1つを選択している場合、Windows エクスプローラーはフォルダー内の各ファイルについて、対応するデータを列プロバイダーに問い合わせます。その後、選択されたすべての列を表示します。

通常、列プロバイダーは特定のファイル種類に対して1つ以上のカスタム列を表示するために使用されます。列プロバイダーはデータの要求を受け取ると、ファイルがサポートする種類のメンバーである場合にデータを提供します。それ以外の場合は、S_FALSE を返して要求を無視します。

列は、fmtid/pid のペアを含む SHCOLUMNID 構造体によって識別されます。可能であれば、既存の fmtid および pid を使用してください。フォルダーに複数のファイル種類が含まれる場合、異なる種類のデータを同じ列にマージできます。たとえば、要約情報プロパティセットの Author pid は、さまざまな用途に使用できます。カスタムの SHCOLUMNID 構造体を使用する場合、その列にはサポートする種類のメンバーであるファイルのデータのみが表示されます。フォルダーに他のファイルが含まれている場合、それらのエントリは空白になります。

Windows エクスプローラーの詳細表示に1つ以上のカスタム列を表示させたい場合は、このインターフェイスをエクスポートするオブジェクトを実装します。Windows エクスプローラーは、列の表示に必要な情報を要求するためにインターフェイスのメソッドを呼び出します。Windows エクスプローラーが使用する手順は次のとおりです。

  1. IColumnProvider::Initialize を呼び出して、表示するフォルダーを指定します。
  2. IColumnProvider::GetColumnInfo を呼び出して、列の特性を取得します。
  3. その列がユーザーによって選択されている場合、フォルダー内の各ファイルについて IColumnProvider::GetItemData を呼び出し、そのファイルの列エントリに属するデータを取得します。
通常の Component Object Model (COM) 登録に加えて、列プロバイダーオブジェクトを Windows エクスプローラーにも登録する必要があります。そのためには、オブジェクトの GUID を文字列形式で表したサブキーを、このキーに追加します。
            <pre><b>HKEY_CLASSES_ROOT</b>

Folder shellex ColumnHandlers

このインターフェイスは Windows エクスプローラーによって呼び出されます。通常、アプリケーションで使用されることはありません。

メソッド 3

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

vtbl 3 HRESULT Initialize(SHCOLUMNINIT* psci)

IColumnProvider インターフェイスを初期化します。

psciSHCOLUMNINIT*in初期化情報を含む SHCOLUMNINIT 構造体。表示する内容を持つフォルダーの情報を含みます。

戻り値

型: HRESULT

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

vtbl 4 HRESULT GetColumnInfo(DWORD dwIndex, SHCOLUMNINFO* psci)

列に関する情報を要求します。

dwIndexDWORDin列の0から始まるインデックス。これは列を列挙するために使用される任意の値です。
psciSHCOLUMNINFO*out列情報を保持する SHCOLUMNINFO 構造体へのポインター。

戻り値

型: HRESULT

要求が失敗したことを示す COM エラー値、または次のいずれかの値を返します。

戻り値 説明
S_OK
要求が成功しました。
S_FALSE
列インデックスが範囲外です。

解説(Remarks)

このメソッドは、列にインデックスを割り当て、その列にどのような種類の情報が含まれるかを問い合わせるために呼び出されます。

vtbl 5 HRESULT GetItemData(PROPERTYKEY* pscid, SHCOLUMNDATA* pscd, VARIANT* pvarData)

指定されたファイルの列データを要求します。

pscidPROPERTYKEY*in列を識別する SHCOLUMNID 構造体。
pscdSHCOLUMNDATA*inファイルを指定する SHCOLUMNDATA 構造体。
pvarDataVARIANT*outpscid で指定された列に属し、pscd で指定されたファイルのデータを持つ VARIANT へのポインター。ファイルが列プロバイダーでサポートされるクラスのメンバーである場合は、この値を設定します。

戻り値

型: HRESULT

ファイルデータが返される場合は S_OK、ファイルが列プロバイダーでサポートされておらずデータが返されない場合は S_FALSE、それ以外の場合は COM エラー値を返します。

解説(Remarks)

このメソッドは、指定された列に表示するファイルのデータを取得するために呼び出されます。スレッドセーフである必要があります。

このメソッドは Windows エクスプローラーが表示するすべてのファイルについて呼び出されますが、その多くは特定の列プロバイダーではサポートされません。パフォーマンスを向上させるには、まず pscd が指す構造体の pwszExt メンバーを確認し、列プロバイダーがサポートするファイル名拡張子を持っているかどうかを調べます。サポートされていない場合は、直ちに S_FALSE を返すことで不要な処理を回避してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IColumnProvider "{E8025004-1C42-11D2-BE2C-00A0C9A83DA1}"
#usecom global IColumnProvider IID_IColumnProvider "{}"
#comfunc global IColumnProvider_Initialize     3 var
#comfunc global IColumnProvider_GetColumnInfo  4 int,var
#comfunc global IColumnProvider_GetItemData    5 var,var,var
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。