Регистрация обработчиков фильтров
Обработчик фильтра должен быть зарегистрирован. Вы также можете найти существующий обработчик фильтра для заданного расширения имени файла через реестр или с помощью интерфейса ILoadFilter .
Эта тема организована следующим образом:
- Регистрация обработчиков фильтров для Поиска Windows
- Замена существующих обработчиков фильтров
- Поиск обработчика фильтра для заданного расширения файла
- Дополнительные ресурсы
- Связанные темы
Примечание
Обработчик фильтра — это реализация интерфейса IFilter .
Регистрация обработчиков фильтров для Поиска Windows
Идентификаторы 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.
Чтобы зарегистрировать новый обработчик фильтра, выполните приведенные далее действия.
- Укажите 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}
- Зарегистрируйте обработчик фильтра со следующими ключами и значениями:
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.
Чтобы найти обработчик фильтра для заданного расширения имени файла, выполните следующие действия:
- Убедитесь, что расширение для типа отфильтрованных файлов имеет постоянный обработчик, зарегистрированный в записи реестра \HKEY_LOCAL_MACHINE\SOFTWARE\Classes.extension. Если да, пусть этот ключ будет {PersistentHandlerGUID}.
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
.htm
PersistentHandler
{PersistentHandlerGUID}
- Если для расширения не зарегистрирован постоянный обработчик, найдите идентификатор 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}
- Определите 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}
- Определите обработчик фильтра: с помощью {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 и Регистрация приложений.
Связанные темы
Разработка обработчиков фильтров
Сведения об обработчиках фильтров в Windows Search
Рекомендации по созданию обработчиков фильтров в Windows Search
Возврат свойств из обработчика фильтра
Обработчики фильтров, поставляемые с Windows