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

Важно понимать необходимую структуру 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 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.

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

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

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

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

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

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

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

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