Реализация обработчиков фильтров в Windows Search
Важно понимать необходимую структуру 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 IFilter . Интерфейс IFilter выгружается после того, как он не используется в течение определенного интервала времени, как указано в значении реестра FilterIdleTimeOut. |
Реализация класса IFilter и фабрики классов
По крайней мере два класса, такие как CFilter и CFilterCF, обычно реализуются каждой библиотекой DLL IFilter . Класс CFilter создает объект интерфейса IFilter , который реализует функцию фильтрации содержимого. Его функции-члены реализуют методы интерфейса интерфейса IFilter . Для каждого класса IFilter требуется уникальный идентификатор класса (CLSID), который создает реализующий интерфейс IFilter .
Класс CFilterCF создает объект class-factory для интерфейса IFilter . Фабрика классов вызывается через интерфейс IClassFactory Interface точкой входа функции DllGetClassObject библиотеки DLL. Класс CFilterCF создает объект CFilter и возвращает указатель на IUnknown. В более сложных случаях IFilter может реализовать иерархию классов вместо одного класса CFilter.
Наследование интерфейсов COM
Windows Search 3.0 и более поздних версий требует использования IPersistStream по следующим причинам:
- Для обеспечения производительности и совместимости в будущем.
- Для повышения безопасности. Фильтры IFilter, реализованные с помощью IPersistStream , являются более безопасными, так как контексту, в котором выполняется интерфейс IFilter , не требуются права на открытие файлов на диске или по сети.
- Хотя в Windows Search используется только IPersistStream, класс интерфейса IFilter также может наследовать реализации интерфейса IPersistFile и (или) интерфейса IPersistStorage для обеспечения обратной совместимости.
Эти интерфейсы объявляются в файлах, входящих в каталог mssdk\include, и имеют предварительно определенные идентификаторы интерфейсов (IID). Клиент индексирования содержимого запрашивает интерфейс IFilter через IUnknown , чтобы определить, какой из этих интерфейсов использовать при фильтрации содержимого.
Реализация методов COM-интерфейса
Интерфейс IFilter реализует методы IUnknown как для класса интерфейса IFilter , так и для фабрики класса интерфейса IFilter . В следующей таблице перечислены интерфейсы и методы интерфейса IFilter , которые должен реализовать интерфейс IFilter в порядке vtable. Интерфейс 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 Search не нужно реализовывать com-методы, перечисленные в следующей таблице.
Метод, который не является обязательным | Описание |
---|---|
IPersistStream::IsDirty | Фильтры должны возвращать E_NOTIMPL. |
IPersistStream::Save | Фильтры должны возвращать E_NOTIMPL. |
IPersistStream::GetSizeMax | Фильтры должны возвращать E_NOTIMPL. |
IFilter::BindRegion | Фильтры должны возвращать E_NOTIMPL. |
Дополнительные ресурсы
- В примере кода IFilterSample , доступном на сайте GitHub, показано, как создать базовый класс IFilter для реализации интерфейса IFilter .
- Общие сведения о процессе индексирования см. в разделе Процесс индексирования.
- Общие сведения о типах файлов см. в разделе Типы файлов.
- Сведения об запросе атрибутов сопоставления файлов для типа файла см. в разделах PerceivedTypes, SystemFileAssociations и Регистрация приложений.
Связанные темы
Разработка обработчиков фильтров
Основные сведения о обработчиках фильтров в Windows Search
Рекомендации по созданию обработчиков фильтров в Windows Search
Возврат свойств из обработчика фильтра
Обработчики фильтров, поставляемые с Windows