IColumnProvider
COM公式ドキュメント
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 エクスプローラーが使用する手順は次のとおりです。
- IColumnProvider::Initialize を呼び出して、表示するフォルダーを指定します。
- IColumnProvider::GetColumnInfo を呼び出して、列の特性を取得します。
- その列がユーザーによって選択されている場合、フォルダー内の各ファイルについて IColumnProvider::GetItemData を呼び出し、そのファイルの列エントリに属するデータを取得します。
<pre><b>HKEY_CLASSES_ROOT</b>
Folder shellex ColumnHandlers
このインターフェイスは Windows エクスプローラーによって呼び出されます。通常、アプリケーションで使用されることはありません。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
IColumnProvider インターフェイスを初期化します。
| psci | SHCOLUMNINIT* | in | 初期化情報を含む SHCOLUMNINIT 構造体。表示する内容を持つフォルダーの情報を含みます。 |
戻り値
型: HRESULT
このメソッドが成功すると S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
列に関する情報を要求します。
| dwIndex | DWORD | in | 列の0から始まるインデックス。これは列を列挙するために使用される任意の値です。 |
| psci | SHCOLUMNINFO* | out | 列情報を保持する SHCOLUMNINFO 構造体へのポインター。 |
戻り値
解説(Remarks)
このメソッドは、列にインデックスを割り当て、その列にどのような種類の情報が含まれるかを問い合わせるために呼び出されます。
指定されたファイルの列データを要求します。
| pscid | PROPERTYKEY* | in | 列を識別する SHCOLUMNID 構造体。 |
| pscd | SHCOLUMNDATA* | in | ファイルを指定する SHCOLUMNDATA 構造体。 |
| pvarData | VARIANT* | out | pscid で指定された列に属し、pscd で指定されたファイルのデータを持つ VARIANT へのポインター。ファイルが列プロバイダーでサポートされるクラスのメンバーである場合は、この値を設定します。 |
戻り値
解説(Remarks)
このメソッドは、指定された列に表示するファイルのデータを取得するために呼び出されます。スレッドセーフである必要があります。
このメソッドは Windows エクスプローラーが表示するすべてのファイルについて呼び出されますが、その多くは特定の列プロバイダーではサポートされません。パフォーマンスを向上させるには、まず pscd が指す構造体の pwszExt メンバーを確認し、列プロバイダーがサポートするファイル名拡張子を持っているかどうかを調べます。サポートされていない場合は、直ちに S_FALSE を返すことで不要な処理を回避してください。
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 方式にも切替可。#define global IID_IColumnProvider "{E8025004-1C42-11D2-BE2C-00A0C9A83DA1}" #usecom global IColumnProvider IID_IColumnProvider "{}" #comfunc global IColumnProvider_Initialize 3 sptr #comfunc global IColumnProvider_GetColumnInfo 4 int,sptr #comfunc global IColumnProvider_GetItemData 5 sptr,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。