列ハンドラーの作成
[この機能は、Windows XP 以前でのみサポートされています。 ]
Windows Windows エクスプローラーの [詳細] ビューには、通常、いくつかの標準列が表示されます。 各列には、現在のフォルダー内の各ファイルのファイル サイズや種類などの情報が一覧表示されます。 列ハンドラーを実装して登録することで、カスタム列を表示できるようにします。
シェル拡張ハンドラーを実装および登録するための一般的な手順については、「 シェル拡張ハンドラーの作成」を参照してください。 このドキュメントでは、列ハンドラーに固有の実装のこれらの側面に焦点を当てます。
次のトピックについて説明します。
列ハンドラーのしくみ
次の図は、[詳細] ビューの Windows エクスプローラーを示しています。
Windows 2000 では、フォルダーは、既定では表示されない多数の列をサポートすることもできます。 ユーザーは、列ヘッダーの 1 つを右クリックし、メニューから [ その他... ] コマンドを選択することで、追加の列を表示できます。 その後、フォルダーで使用可能な列を一覧表示するダイアログ ボックスが表示され、ユーザーは表示する列を選択できます。 次の図は、前の例のこのダイアログ ボックスを示しています。
列ハンドラーを作成することで、カスタム列を作成し、そのリストに追加できます。 たとえば、音楽を含むファイルのコレクションでは、列ハンドラーを使用して、各ファイルに含まれるアーティストと作品を一覧表示する列を表示できます。
列ハンドラーは、Windows エクスプローラーが [詳細] ビューを表示するたびに呼び出されるグローバル オブジェクトです。 ただし、通常、列ハンドラーは、特定の ファイルの種類のメンバーに対してのみカスタム列を表示するために使用されます。 詳細ビューを表示する前に、Windows エクスプローラーは、登録されているすべての列ハンドラーの列特性を照会します。 ユーザーがハンドラーの列の 1 つを選択した場合、Windows エクスプローラーは関連付けられたデータのハンドラーに対してクエリを実行します。 列ハンドラーは、データの要求を受け取ると、そのファイルがサポートされている型のメンバーである場合に提供します。 それ以外の場合は、S_FALSEを返して要求を無視します。
列ハンドラーの登録
列ハンドラーは、次のサブキーの下に登録されます。
HKEY_CLASSES_ROOT
Folder
shellex
ColumnHandlers
ハンドラーのクラス識別子 (CLSID) GUID の文字列形式を使用して、 という名前の ColumnHandlers のサブキーを作成します。 シェル拡張機能ハンドラーを登録する方法の一般的な説明については、「 シェル拡張機能ハンドラーの作成」を参照してください。 次の例は、列ハンドラーを登録する方法を示しています。
HKEY_CLASSES_ROOT
Folder
shellex
ColumnHandlers
{My Column Handler CLSID GUID}
列ハンドラーの実装
すべてのシェル拡張ハンドラーと同様に、列ハンドラーは DLL として実装されたインプロセス コンポーネント オブジェクト モデル (COM) オブジェクトです。 IUnknown に加えて、IColumnProvider インターフェイスをエクスポートします。
Windows エクスプローラーは、IColumnProvider によってエクスポートされた 3 つのメソッドを呼び出して、列を表示するために必要な情報を要求します。 Windows エクスプローラーで使用される手順は次のとおりです。
- IColumnProvider::Initialize を呼び出して、表示されるフォルダーを指定します。
- IColumnProvider::GetColumnInfo を呼び出して、列の識別子と特性を取得します。
- ユーザーが列を選択している場合は、フォルダー内の各ファイルに対して IColumnProvider::GetItemData を呼び出して、ファイルの列エントリに属するデータを取得します。
Initialize メソッド
Windows エクスプローラーは、IColumnProvider::Initialize を呼び出して列ハンドラーを初期化します。 メソッドには 3 つのパラメーターがありますが、現在使用されている のは wszFolder のみです。 詳細ビューが表示されるフォルダーに設定されます。 後で使用するためにフォルダー名を格納し、必要に応じてハンドラー オブジェクトを初期化します。
GetColumnInfo メソッド
Windows エクスプローラー次に IColumnProvider::GetColumnInfo を呼び出して、列の識別子と特性を要求します。 dwIndex パラメーターの列のインデックスを渡します。 このインデックスは、列の列挙に使用される任意の値です。 Windows エクスプローラーでは、SHCOLUMNINFO 構造体へのポインターも渡されます。 この構造体は、列の識別子と特性を返すために使用されます。 IColumnProvider::GetColumnInfo は構造体のメンバーに適切な値を割り当てて返す必要があります。
列は、OLE プロパティ セット ID (FMTID) と関連付けられたプロパティ ID (PID) によって識別されます。 SHCOLUMNINFO 構造体 scid の最初のメンバーは、列の識別に使用される SHCOLUMNID 構造体へのポインターです。 その fmtid メンバーは 列の FMTID を保持し、その pid メンバーは列の PID を保持します。 たとえば、列の識別に一般的に使用される標準の FMTID/PID ペアは、Summary Information プロパティ セットの Author PID です。
可能であれば、ハンドラーは既存の FMTID と PID を使用して、それがサポートする列を識別する必要があります。 カスタム SHCOLUMNID 構造体を使用する場合、この列には、ハンドラーでサポートされているファイルのデータのみが表示されます。 フォルダーに他のファイルが含まれている場合、そのエントリは空白になります。 フォルダーに複数のファイルの種類のファイルが含まれている場合、標準の FMTID/PID 値を使用すると、異なる種類のデータを同じ列にマージできます。
vt メンバーを、列に表示するデータの VARIANT 型に設定します。 ほとんどの列ではデータが文字列として表示されるため、最もよく使用される型はVT_LPSTRです。 SHCOLUMNINFO 構造体の残りのメンバーは、列の特性を定義するために使用されます。 必要に応じて値を割り当てます。
GetItemData メソッド
列ハンドラーの列が選択されている場合、Windows エクスプローラーは、表示するフォルダー内の各ファイルに対して IColumnProvider::GetItemData を呼び出します。 pscid パラメーターは、列を識別する SHCOLUMNID 構造体へのポインターです。 pscd パラメーターは、特定のファイルを識別する SHCOLUMNDATA 構造体を指します。
pvarData パラメーターは、pscd で指定されたファイルのハンドラーの列に表示する必要があるデータを返します。 そのファイルが列ハンドラーでサポートされている場合は、そのデータ値を pvarData に割り当てて、S_OKを返します。 ファイルが列ハンドラーでサポートされていない場合は、 pvarData に値を割り当てずにS_FALSEを返します。
多くのフォルダーには、特定の列ハンドラーでサポートされていない多数のファイルが含まれます。 効率を向上させるために、IColumnProvider::GetItemData はまず pscd が指す構造体の pwszExt メンバーをチェックする必要があります。 このメンバーは、ファイル名拡張子を保持します。 ファイルがハンドラーでサポートされているファイルの種類のメンバーではないことが拡張機能で示されている場合は、S_FALSEを直ちに返すことで不要な処理を回避します。