ハンドラは、特定の拡張子を持ったファイルのプロパティを表示する場合に使用します。プロパティとは、次の図におけるタグのようなものです。ハンドラのオブジェクトは、IPropertyStore、IPropertyStoreCapabilities、IInitializeWithStreamを実装する必要があります。InitializeがIInitializeWithStreamのメソッドになります。これらのIIDはQueryInterfaceに送られてきません。IPropertyStoreのGetValueは、ファイルからプロパティを取得しようとする際に呼ばれます。した取得処理を呼び出しの度に行うのは少し非効率といえるはずです。それを返すようにしたほうがよいでしょう。Initializeで取得することになります。それをIPropertyStoreCacheで表すことができます。これがプロパティをメモリに展開するという意味になります。g_propKeySupport[0](中身はPKEY_Keywords)はシェルで言うところの「タグ」に相当します。第2引数はプロパティの設定するデータであり、これはPROPVARIANT構造体でなければなりません。InitPropVariantFromStringを呼び出せば、第1引数の文字列を基にPROPVARIANT構造体を作成することができます。実際の開発ではファイルから該当プロパティを取得するためにIStream::Readを呼び出すことになるでしょう。IStreamはプロパティをファイルに格納する際にも必要になるため、メンバ変数に保存すると共に参照カウントを1つ上げておきます。これは、Initializeの終了時にIStreamで表されるオブジェクトが破棄されないようにするためです。次に示す3つのメソッドの実装は非常に単純です。pv);}GetCountは、ファイルがサポートするプロパティの数を取得する際に呼ばれます。このための具体的な処理は、IPropertyStoreCache::GetCountを呼び出せば行うことができます。GetAtは、特定のインデックスに関連するPROPERTYKEYを取得する際に呼ばれます。これもIPropertyStoreCacheのGetAtを呼び出すだけで構いません。これもIPropertyStoreCacheのGetValueを呼び出すことになります。プロパティを設定するSetValueを呼び出すことはありません。よって、E_FAILを返すだけで問題ありません。次のような実装になるでしょうか。g_propKeySupportにはファイルがサポートするプロパティのキーが格納されています。一致する場合はSetValueAndStateを呼び出してプロパティを設定します。IsEqualPropertyKeyは、指定された2つのPROPERTYKEYが一致するかを調べるマクロです。SetValueを呼び出したアプリケーションは、最終的にCommitを呼び出すことになります。この方法はファイルの形式によって大きく異なります。よって、次のコードはイメージとして考えてください。これをPropVariantToStringで文字列に変換します。IStram::Writeを呼び出して文字列をファイルに書き込みます。最終的にIStram::Commitを呼び出すことによって、書き込み内容はファイルに反映されることになります。ハンドラは、IPropertyStoreの他にIPropertyStoreCapabilitiesを実装するべきとされています。上記のような実装で問題ないようです。ハンドラを登録するには、次に示すレジストリキーを作成することになります。プロパティの取得が終了した場合は直ちにアンロードされます。DLLが認識されるためには、登録後にシェルを再起動する必要があります。今回と同じような動作を行うには主に2つの方法があります。この値をファイルのプロパティにすれば、プロパティが表示されているように見えることになります。使いやすいインターフェースとは言えないでしょう。Vistaからサポートされなくなりました。これはIPropertyStoreの前身に当たります。IPropertySetStorageはほとんど使用されていないことが分かります。これは、プロパティを取り扱う標準がIPropertyStoreに置き換わった事実を物語っているといえるでしょう。IPropertySetStorageに対応しています。