Поделиться через


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

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

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

Заметка

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

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

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

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

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

Поиск Windows учитывает модель потоков, указанную для обработчика фильтра. Если для модели потоков задано значение 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. Если для расширения не зарегистрирован постоянный обработчик, найдите 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-00DD01065AF дает идентификатор 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

Дополнительные ресурсы

  • Пример кода IFilterSample, доступный на GitHub, демонстрирует, как создать базовый класс IFilter для реализации интерфейса IFilter.
  • Для получения общего представления о процессе индексирования см. Процесс индексирования.
  • Обзор типов файлов см. в Типы файлов.
  • Для запроса атрибутов сопоставления файлов для типа файла см. разделы PerceivedTypes, SystemFileAssociations иApplication Registration.

разработка обработчиков фильтров

Об обработчиках фильтров в Поиске Windows

Лучшие рекомендации по созданию обработчиков фильтров в Windows Search

возврат свойств из обработчика фильтров

Обработчики фильтров , поставляемые с Windows

Реализация обработчиков фильтров в Windows Search

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