Реализация обработчиков фильтров в поиске Windows
Важно, чтобы вы понимали необходимую структуру DLL для обработчика фильтров (реализацию интерфейса IFilter).
Этот раздел организован следующим образом:
- Реализация и экспорт точек входа DLL
- Реализация класса IFilter и фабрики классов
- наследование COM-интерфейсов
- Реализация методов COM-интерфейса
- дополнительные ресурсы
- Связанные темы
Реализация и экспорт точек входа 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. |
Дополнительные ресурсы
- Пример кода IFilterSample, доступный в GitHub, демонстрирует, как создать базовый класс IFilter для реализации интерфейса IFilter.
- Для общего представления о процессе индексирования см. Процесс индексирования.
- Для обзора типов файлов см. Типы файлов.
- Чтобы запросить атрибуты сопоставления файлов для типа файла, см. PerceivedTypes, SystemFileAssociations и Регистрация приложений.
Связанные разделы
разработка обработчиков фильтров
Основные сведения об обработчиках фильтров в поиске Windows
Лучшие практики по созданию обработчиков фильтров в поиске Windows
возврат свойств из обработчика фильтров
Обработчики фильтров , которые поставляются с Windows