Регистрация обработчиков фильтров

Обработчик фильтра должен быть зарегистрирован. Вы также можете найти существующий обработчик фильтра для заданного расширения имени файла через реестр или с помощью интерфейса ILoadFilter .

Эта тема организована следующим образом:

Примечание

Обработчик фильтра — это реализация интерфейса IFilter .

Идентификаторы GUID, необходимые для регистрации нового обработчика протокола или для поиска существующего обработчика протокола, перечислены в следующей таблице.

GUID Определяемый пользователем или приложением Описание
89BCB740-6119-101A-BCB7-00DD010655AF Приложение GUID интерфейса IFilter является константой раздела реестра для всех обработчиков фильтров.
{PersistentHandlerGUID} Пользователь Это GUID для постоянного обработчика.
{FilterHandlerCLSID} Пользователь Это идентификатор класса (CLSID) для обработчика фильтра.
{ApplicationGUID} Пользователь Это промежуточный (агрегированный) GUID.

Обработчики фильтров должны быть зарегистрированы в HKEY_LOCAL_MACHINE, так как SearchFilterHost.exe выполняется под учетной записью SYSTEM и поэтому не может получить доступ к разделам реестра для HKEY_CURRENT_USER для вошедшего пользователя. Кроме того, группа "Пользователи" должна иметь доступ на чтение и выполнение к обработчику фильтров .dll, так как SearchFilterHost.exe удаляет все права администратора и разрешает только права, не являющиеся администраторами. Так как расположение проекта Visual Studio по умолчанию находится в каталоге текущего пользователя и поэтому не предоставляет разрешения на чтение группе Пользователи, необходимо либо переместить .dll, либо изменить списки управления доступом, чтобы разрешить доступ к 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

Устаревший подход к регистрации обработчиков фильтров

Этот подход не рекомендуется использовать. Фильтры можно зарегистрировать для CLSID, представляющего класс COM, и (или) для расширения имени файла. Вы можете зарегистрировать оба фильтра, если необходимо зарегистрировать обработчик фильтра для класса и другой обработчик фильтра для расширения имени файла в классе. Обратите внимание, что обработчик фильтра, зарегистрированный для расширения имени файла, имеет приоритет над обработчиком фильтра для CLSID.

Эти записи являются стандартными записями реестра OLE вплоть до записи для класса CLSID\{ApplicationGUID}. Библиотека DLL sample.dll реализует поведение выполняющихся объектов для класса .txt. Обратите внимание на дополнительную запись PersistentHandler. Эта запись указывает класс, отвечающий за брокер запросов к постоянным объектам примера класса. Запись в разделе PersistentAddinsRegistered определяет реализацию, отвечающую за интерфейс с именем 89BCB740-6119-101A-BCB7-00DD010655AF(IID_IFilter). Класс, реализуя IID_IFilter , содержит стандартные записи реестра OLE. Библиотека DLL InprocServer32 загружается с помощью стандартного механизма OLE.

Windows Search наблюдает модель потоков, указанную для обработчика фильтра. Если для потоковой модели задано значение Оба, обработчик фильтра должен быть потокобезопасн; В противном случае, если он не является потокобезопасной, укажите 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. Если для расширения не зарегистрирован постоянный обработчик, найдите идентификатор CLSID, связанный с типом документа, в записи реестра \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Пусть этот ключ будет {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

Тестирование обработчиков фильтров