次の方法で共有


フィルター ハンドラーの登録

フィルター ハンドラーを登録する必要があります。 レジストリまたは ILoadFilter インターフェイスを使用して、特定のファイル名拡張子の既存のフィルター ハンドラーを見つけることもできます。

このトピックは次のように整理されています。

Note

フィルター ハンドラーは、 IFilter インターフェイスの実装です。

新しいプロトコル ハンドラーの登録または既存のプロトコル ハンドラーの検索に必要な GUID を次の表に示します。

GUID ユーザーまたはアプリケーションの定義 説明
89BCB740-6119-101A-BCB7-00DD010655AF Application IFilter インターフェイス GUID は、すべてのフィルター ハンドラーのレジストリ キー定数です。
{PersistentHandlerGUID} User これは永続的ハンドラーの GUID です。
{FilterHandlerCLSID} User これは、フィルター ハンドラーのクラス識別子 (CLSID) です。
{ApplicationGUID} User これは中間 (集計) GUID です。

SearchFilterHost.exeが SYSTEM アカウントで実行されているため、ログオンしているユーザーのHKEY_CURRENT_USERのレジストリ キーにアクセスできないため、フィルター ハンドラーをHKEY_LOCAL_MACHINEに登録する必要があります。 さらに、ユーザー グループは、フィルター ハンドラー.dllそれ自体に対する読み取りと実行のアクセス権を持っている必要があります。これは、SearchFilterHost.exeはすべての管理者権限を削除し、管理者権限以外の権限のみを許可するためです。 既定の Visual Studio プロジェクトの場所は現在のユーザーのディレクトリにあるため、Users グループに対する読み取りアクセス許可は付与されないため、.dllを移動するか、ACL を変更してSearchFilterHost.exeアクセスを許可する必要があります。

新しいフィルター ハンドラーを登録するときは、わかりやすい名前 (HTML IFilter など) を使用することをお勧めします。

新しいフィルター ハンドラーを登録するには:

  1. フィルター ハンドラーを使用する拡張ハンドラーと永続的ハンドラー GUID を指定します。
    HKEY_LOCAL_MACHINE
       Software
          Classes
             .txt
                PersistentHandler
                   (Default) = {PersistentHandlerGUID}
    HKEY_LOCAL_MACHINE
       Software
          Classes
             CLSID
                {PersistentHandlerGUID}
                   PersistentAddinsRegistered
                      {89BCB740-6119-101A-BCB7-00DD010655AF}l
                         (Default) = {FilterHandlerCLSID}
  1. 次のキーと値を使用してフィルター ハンドラーを登録します。
    HKEY_LOCAL_MACHINE
       Software
          Classes
             CLSID
                {FilterHandlerCLSID}
                   (Default) = {DescriptiveFilterHandlerName}
                   InprocServer32
                      (Default) = DLL Install Path
                      ThreadingModel = Both

フィルター ハンドラーを登録するための古いアプローチ

この方法は、使用することはお勧めしません。 フィルターは、コンポーネント オブジェクト モデル (COM) クラスを表す CLSID、またはファイル名拡張子に対して登録できます。 クラスのフィルター ハンドラーを登録する必要がある場合は、両方のフィルターを登録し、クラス内のファイル名拡張子に対して別のフィルター ハンドラーを登録できます。 ファイル名拡張子に登録されたフィルター ハンドラーは、CLSID のフィルター ハンドラーよりも優先されることに注意してください。

これらのエントリは、 CLSID\{ApplicationGUID} クラスのエントリまでの標準 OLE レジストリ エントリです。 DLL sample.dllは、.txt クラスの実行中のオブジェクト動作を実装します。 追加のエントリ PersistentHandler をメモします。 このエントリは、サンプル クラスの永続オブジェクトへの要求を仲介するクラスを指定します。 PersistentAddinsRegistered の下のエントリは、89BCB740-6119-101A-BCB7-00DD010655AF(IID_IFilter) という名前のインターフェイスを担当する実装を識別します。 IID_IFilterを実装するクラスには、標準の OLE レジストリ エントリがあります。 InprocServer32 DLL は、標準の OLE メカニズムを介して読み込まれます。

Windows Search では、フィルター ハンドラーに対して指定されたスレッド モデルが観察されます。 スレッド モデルが Both に設定されている場合、フィルター ハンドラーはスレッド セーフである必要があります。それ以外の場合は、スレッド セーフでない場合は、Apartment を指定 します。 フィルター ハンドラーは常にスレッド セーフである必要があることに注意してください。

次のレジストリ エントリの例は、クラスとファイル名拡張子に登録されたフィルター ハンドラー用です。 {PersistentHandlerGUID}{FilterHandlerCLSID} は 、フィルター ハンドラーの作成者が指定する必要がある値を示す変数として使用されます。 値の型は REG_SZ です。

HKEY_LOCAL_MACHINE
   Software
      Classes
         .txt
            (Default) = SampleFile
         SampleFile
            (Default) = Class for Sample Files
            CLSID
               (Default) = {ApplicationGUID}
         CLSID
            {ApplicationGUID}
               (Default) = Sample Files
               InprocServer32
                  (Default) = sample.dll
               PersistentHandler
                  (Default) = {PersistentHandlerGUID}
            {PersistentHandlerGUID}
               (Default) = Sample file persistent handler
               PersistentAddinsRegistered
                  {89BCB740-6119-101A-BCB7-00DD010655AF}l
                     (Default) = {FilterHandlerCLSID}
            {FilterHandlerCLSID}
               (Default) = Sample Files
               InprocServer32
                  (Default) = sampfilt.dll
                  ThreadingModel = Both

既存のフィルター ハンドラーの置き換え

.txt、.doc、.html、.url などの一般的なファイルの種類の組み込みフィルター ハンドラーは置き換えないことをお勧めします。これは、他のシステム コンポーネントに望ましくない影響を及ぼす可能性があるためです。 電子メール メッセージ本文のインデックス作成は、たとえば、.txt、.html、.rtf フィルター ハンドラーによって異なります。

ファイルの種類の新しいフィルター ハンドラーが既存のフィルター登録の代わりとしてインストールされている場合、インストーラーは現在の登録を保存し、新しいフィルター ハンドラーがアンインストールされた場合に復元する必要があります。 フィルターをチェーンするメカニズムはありません。 そのため、新しいフィルター ハンドラーは、古いフィルターの必要な機能をレプリケートする役割を担います。

特定のファイル拡張子のフィルター ハンドラーを検索する

ILoadFilter インターフェイスを使用して、指定されたファイル名拡張子のフィルター ハンドラーを見つけることができます。 次のレジストリ エントリの例は、HTML ファイルに対してこれを行う方法を示しています。 この例では、HTML ドキュメントのフィルター ハンドラーがnlhtml.dllされています。 値の型は REG_SZ です。

指定されたファイル名拡張子のフィルター ハンドラーを検索するには:

  1. フィルター処理されるファイルの種類の拡張子に、レジストリ エントリ \HKEY_LOCAL_MACHINE\SOFTWARE\Classes.extensionの下に永続的なハンドラーが登録されているかどうかを確認します。 その場合は、このキーを {PersistentHandlerGUID} にします。
    HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {PersistentHandlerGUID}
  1. 拡張機能に永続的なハンドラーが登録されていない場合は、レジストリ エントリ \HKEY_LOCAL_MACHINE\SOFTWARE\Classesで、ドキュメントの種類に関連付けられている CLSID を見つけます。 このキーを {ApplicationGUID} に設定します。 次に、CLSID に永続的ハンドラーが登録されているかどうかを確認します。{ApplicationGUID} を使用して、\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{ApplicationGUID} エントリの永続ハンドラーを見つけます。 このキーを {PersistentHandlerGUID} に設定します。
    HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                (Default) = Class for WWW HTML files
                CLSID
                   (Default) = {25336920-03F9-11CF-8FD0-00AA00686F13}
             CLSID
                {25336920-03F9-11CF-8FD0-00AA00686F13}
                   PersistentHandler
                      (Default) = {PersistentHandlerGUID}
  1. 永続的ハンドラーの GUID を確認します。{PersistentHandlerGUID} を使用して、ドキュメントの種類の永続的なハンドラー GUID を見つけます。 レジストリ エントリHKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{PersistentHandlerGUID}\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF の値は、このドキュメントの種類の永続的なハンドラー GUID を生成します。 このキーを {FilterHandlerCLSID} に設定します。
    HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             {PersistentHandlerGUID}
                (Default) = HTML File Persistent Handler<dl>
                    REG_SZ     {89BCB740-6119-101A-BCB7-00DD010655AF}
                    REG_SZ     (Default) = {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. フィルター ハンドラーを決定する: 前の手順で決定した {FilterHandlerCLSID} を使用して、エントリ \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{FilterHandlerCLSID}\InprocServer32の下にあるフィルター ハンドラーを見つけます。 この例では、使用されるわかりやすいフィルター ハンドラー名は HTML IFilter です。
    HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             CLSID
                {EEC97550-47A9-11CF-B952-00AA0051FE20}
                   (Default) = HTML IFilter
                    Data type  REG_SZ
                    InprocServer32
                    nlhtml.dll

その他のリソース

フィルター ハンドラーの開発

Windows Search のフィルター ハンドラーについて

Windows Search でフィルター ハンドラーを作成するためのベスト プラクティス

フィルター ハンドラーからプロパティを返す

Windows に付属するフィルター ハンドラー

Windows Search でのフィルター ハンドラーの実装

フィルター ハンドラーのテスト