Implementando manipuladores de filtro na Pesquisa do Windows

É importante que você entenda a estrutura de DLL necessária de um manipulador de filtro (uma implementação da interface IFilter ).

Este tópico é organizado da seguinte maneira:

Implementando e exportando os pontos de entrada de DLL

Cada DLL de IFilter (indicada por Ifilter.dll nesta seção) deve implementar e exportar os pontos de entrada a seguir. Esses pontos de entrada normalmente são exportados usando um arquivo de definição de módulo (.def) para a interface IFilter ou usando o palavra-chave __declspec(dllexport). O arquivo DLL pode ser registrado para estar em qualquer pasta, mas geralmente reside na pasta %SystemRoot%\system32.

Os pontos de entrada de DLL são listados e descritos na tabela a seguir.

Nome da DLL Descrição da DLL
Dllregisterserver O ponto de entrada DllRegisterServer registra a DLL como um filtro no registro. Registre a DLL executando o programa regsvr32.exe com o nome de arquivo DLL da interface IFilter como um argumento: regsvr32.exe %SystemRoot%\system32\Ifilter.dll
Função DllUnregisterServer O ponto de entrada da função DllUnregisterServer remove a DLL como um manipulador persistente no registro. Cancele o registro da DLL executando o programa regsvr32.exe com o /u sinalizador : regsvr32.exe /u %SystemRoot%\system32\Ifilter.dll
Função DllGetClassObject O cliente de indexação de conteúdo chama o ponto de entrada da Função DllGetClassObject , por meio do COM (Component Object Model), para criar um objeto de fábrica de classe para a interface IFilter e para obter um ponteiro para a interface de fábrica de classe desse objeto.
Função DllCanUnloadNow O cliente de indexação de conteúdo chama o ponto de entrada da função DllCanUnloadNow , por meio de COM, para determinar se é possível descarregar a DLL IFilter . A interface IFilter é descarregada depois de não ser usada por um intervalo de tempo, conforme especificado pelo valor do Registro FilterIdleTimeOut.

Implementando a classe IFilter e a fábrica de classes

Pelo menos duas classes, como CFilter e CFilterCF, normalmente são implementadas por cada DLL IFilter . A classe CFilter produz o objeto de interface IFilter que implementa a funcionalidade de filtragem de conteúdo. Suas funções membro implementam os métodos de interface da interface IFilter . Cada classe IFilter requer um CLSID (identificador de classe exclusivo), que o implementador de interface IFilter gera.

A classe CFilterCF produz o objeto class-factory para a interface IFilter . A fábrica de classes é chamada, por meio de sua interface IClassFactory Interface , pelo ponto de entrada da função DllGetClassObject da DLL. A classe CFilterCF cria o objeto CFilter e retorna um ponteiro para IUnknown. Em casos mais complexos, um IFilter pode implementar uma hierarquia de classe no lugar da única classe CFilter.

Herdando as interfaces COM

O Windows Search 3.0 e posteriores exigem que você use IPersistStream pelos seguintes motivos:

Essas interfaces são declaradas em arquivos incluídos do diretório mssdk\include e têm IIDs (identificadores de interface predefinidos). O cliente de indexação de conteúdo consulta a interface IFilter por meio de IUnknown para determinar quais dessas interfaces usar ao filtrar conteúdo.

Implementando os métodos de interface COM

A interface IFilter implementa os métodos IUnknown para a classe de interface IFilter e a fábrica de classe de interface IFilter . A tabela a seguir lista, em ordem vtable, as interfaces e métodos específicos da interface IFilter que a interface IFilter deve implementar. A interface IFilter deve implementar pelo menos IPersistStream, mas pode implementar interfaces adicionais derivadas de IPersist.

Interface COM Método
IClassFactory Interface CreateInstance, LockServer
IClassFactory2 Interface GetLicInfo, RequestLicKey, CreateInstanceLic
Ifilter IFilter::Init, IFilter::GetChunk, IFilter::GetText, IFilter::GetValue, IFilter::BindRegion
IPersist Interface Getclassid
IPersistFile Interface IsDirty, Load, Save, SaveCompleted, GetCurFile
IPersistStorage Interface IsDirty, Load, Save, GetSizeMax
Ipersiststream IsDirty, Load, Save, GetSizeMax

A página de referência para cada método especifica os parâmetros e o comportamento funcional para esse método. Cada página de referência também fornece os códigos de resultado a serem implementados para esse método. As páginas de referência para os métodos IFilter fornecem os códigos específicos da interface em FACILITY_ITF códigos de resultado a serem implementados e o cliente de indexação de conteúdo também pode lidar com qualquer um dos códigos de resultado genéricos, como FACILITY_NULL e FACILITY_WIN32. Para obter mais informações, consulte Estrutura de códigos de erro COM.

Métodos COM que não são implementados

A interface IFilter deve implementar pelo menos IPersistStream, mas não precisa implementar interfaces adicionais derivadas de IPersist.

O Windows Search não precisa implementar os métodos COM listados na tabela a seguir.

Método que não é necessário Descrição
IPersistStream::IsDirty Os filtros devem retornar E_NOTIMPL.
IPersistStream::Save Os filtros devem retornar E_NOTIMPL.
IPersistStream::GetSizeMax Os filtros devem retornar E_NOTIMPL.
IFilter::BindRegion Os filtros devem retornar E_NOTIMPL.

Recursos adicionais

Desenvolvendo manipuladores de filtro

Noções básicas sobre manipuladores de filtro na Pesquisa do Windows

Práticas recomendadas para criar manipuladores de filtro no Windows Search

Retornando propriedades de um manipulador de filtro

Filtrar manipuladores que enviam com o Windows

Registrando manipuladores de filtro

Testando manipuladores de filtro