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


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

Важно, чтобы вы понимали необходимую структуру DLL для обработчика фильтров (реализацию интерфейса IFilter).

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

Реализация и экспорт точек входа DLL

Каждая библиотека DLL IFilter (обозначаемая как Ifilter.dll в этом разделе) должна реализовать и экспортировать следующие точки входа. Обычно эти точки входа экспортируются с помощью файла определения модуля (.def) для интерфейса IFilter или с помощью ключевого слова __declspec(dllexport). DLL-файл можно зарегистрировать в любой папке, но обычно он находится в папке %SystemRoot%\system32.

Точки входа DLL перечислены и описаны в следующей таблице.

Имя DLL Описание библиотеки DLL
DllRegisterServer Точка входа DllRegisterServer регистрирует библиотеку DLL в качестве фильтра в реестре. Вы регистрируете DLL, запустив программу regsvr32.exe, передав имя файла DLL интерфейса IFilter в качестве аргумента: regsvr32.exe %SystemRoot%\system32\Ifilter.dll.
Функция DllUnregisterServer Функция DllUnregisterServer удаляет библиотеку DLL как постояннодействующего обработчика в реестре. Отмена регистрации библиотеки DLL путем запуска программы regsvr32.exe с флагом /u: regsvr32.exe /u %SystemRoot%\system32\Ifilter.dll
Функция DllGetClassObject Клиент индексирования содержимого вызывает точку входа функции DllGetClassObject через объектную модель компонента (COM), чтобы создать объект фабрики классов для интерфейса IFilter и получить указатель на интерфейс фабрики классов этого объекта.
Функция DllCanUnloadNow Клиент индексирования содержимого вызывает функцию DllCanUnloadNow точку входа через COM, чтобы определить, можно ли выгрузить библиотеку DLL IFilt er. Интерфейс IFilter выгружается после того, как он не используется в течение интервала времени, как указано в значении реестра FilterIdleTimeOut.

Реализация класса и фабрики классов IFilter

Как минимум два класса, такие как CFilter и CFilterCF, обычно реализуются каждой IFilter DLL. Класс CFilter создает объект интерфейса IFilter, реализующий функции фильтрации содержимого. Его функции-члены реализуют методы интерфейса IFilter. Для каждого класса IFilter требуется уникальный идентификатор класса (CLSID), который создает средство реализации интерфейса IFilter.

Класс CFilterCF создает объект фабрики классов для интерфейса IFilter. Фабрика классов вызывается через свой интерфейс IClassFactory функцией DllGetClassObject в точке входа библиотеки DLL. Класс CFilterCF создает объект CFilter и возвращает указатель на IUnknown. В более сложных случаях IFilter может реализовать иерархию классов вместо одного класса CFilter.

Наследование COM-интерфейсов

Для windows Search 3.0 и более поздних версий требуется использовать IPersistStream по следующим причинам:

  • Обеспечение производительности и будущей совместимости.
  • Чтобы повысить безопасность. IFilters, реализованные с помощью IPersistStream, являются более безопасными, так как контекст, в котором выполняется интерфейс IFilter, не требует прав на открытие файлов на диске или по сети.
  • Хотя поиск Windows использует только IPersistStream, класс интерфейса IFilter также может наследовать интерфейс IPersistFile и/или реализации интерфейсов IPersistStorage для обратной совместимости.

Эти интерфейсы объявляются в файлах, включенных из каталога mssdk\include, и имеют предварительно определенные идентификаторы интерфейса (IID). Клиент индексирования содержимого запрашивает интерфейс IFilter через IUnknown, чтобы определить, какие из этих интерфейсов следует использовать при фильтрации содержимого.

Реализация методов интерфейса COM

Интерфейс IFilter реализует методы IUnknown для класса интерфейса IFilter и фабрики классов интерфейса IFilter. В следующей таблице перечислены в порядке vtable интерфейсы и методы, специфичные для интерфейса IFilter, которые должен реализовать интерфейс IFilter. Интерфейс IFilter должен реализовать по крайней мере IPersistStream, но может реализовать дополнительные интерфейсы, производные от IPersist.

COM-интерфейс Метод
Интерфейс IClassFactory CreateInstance, LockServer
Интерфейс IClassFactory2 GetLicInfo, RequestLicKey, CreateInstanceLic
IFilter IFilter::Init, IFilter::GetChunk, IFilter::GetText, IFilter::GetValue, IFilter::BindRegion
интерфейс IPersist GetClassID
интерфейс IPersistFile IsDirty, Load, Save, SaveCompleted, GetCurFile
интерфейс IPersistStorage IsDirty, Load, Save, GetSizeMax
IPersistStream IsDirty, Load, Save, GetSizeMax

Эталонная страница для каждого метода определяет параметры и функциональное поведение этого метода. Каждая эталонная страница также предоставляет коды результатов для реализации этого метода. Справочные страницы для методов IFilter предоставляют специфичные для интерфейса коды в формате кодов результатов FACILITY_ITF, а клиент индексирования содержимого также может обрабатывать любые общие коды результатов, такие как FACILITY_NULL и FACILITY_WIN32. Дополнительные сведения см. в разделе Структура кодов ошибок COM.

Методы COM, которые не реализованы

ИнтерфейсIFilterдолжен реализовать по крайней мере IPersistStream, но не требует реализации дополнительных интерфейсов, производных от IPersist.

Поиск Windows не требует реализации методов COM, перечисленных в следующей таблице.

Метод, который не требуется Описание
IPersistStream::IsDirty Фильтры должны возвращать E_NOTIMPL.
IPersistStream::Save Фильтры должны возвращать E_NOTIMPL.
IPersistStream::GetSizeMax Фильтры должны возвращать E_NOTIMPL.
IFilter::BindRegion Фильтры должны возвращать E_NOTIMPL.

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

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

Основные сведения об обработчиках фильтров в поиске Windows

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

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

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

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

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