Noções básicas sobre manipuladores de filtro na Pesquisa do Windows
Manipuladores de filtro, que são implementações da interface IFilter , verificam documentos em busca de texto e propriedades. Os manipuladores de filtro extraem partes de texto desses itens, filtrando a formatação inserida e retendo informações sobre a posição do texto. Eles também extraem partes de valores, que são propriedades do documento. O IFilter é a base para a criação de aplicativos de nível superior, como indexadores de documentos e visualizadores independentes de aplicativos.
Este tópico é organizado da seguinte maneira:
- Sobre a interface IFilter
- Localizando o identificador de classe IFilter
- Recursos adicionais
- Tópicos relacionados
Sobre a interface IFilter
A Pesquisa do Microsoft Windows usa filtros para extrair o conteúdo de itens para inclusão em um índice de texto completo. Você pode estender a Pesquisa do Windows para indexar tipos de arquivo novos ou proprietários escrevendo filtros para extrair o conteúdo e manipuladores de propriedade para extrair as propriedades dos arquivos.
A interface IFilter foi projetada para atender às necessidades específicas dos mecanismos de pesquisa de texto completo. Mecanismos de pesquisa de texto completo, como o Windows Search, chamam os métodos IFilter para extrair informações de texto e propriedade e adicioná-las a um índice. O Windows Search divide os resultados do método IFilter::GetText retornado em palavras, normaliza-os e os salva em um índice. Se disponível, o mecanismo de pesquisa usa o LCID (identificador de código de idioma) de uma parte de texto para executar a quebra e a normalização de palavras específicas do idioma.
O Windows Search usa três funções, descritas na tabela a seguir, para acessar manipuladores de filtro registrados (implementações da interface IFilter ). Essas funções são especialmente úteis ao carregar e associar ao manipulador de filtro de um objeto inserido.
Função | Descrição |
---|---|
LoadIFilter | Obtém um ponteiro para o IFilter mais adequado para o tipo de conteúdo especificado. |
BindIFilterFromStorage | Obtém um ponteiro para o IFilter mais adequado para o conteúdo contido em um objeto IStorage Interface . |
BindIFilterFromStream | Obtém um ponteiro para o IFilter mais adequado para um CLSID (identificador de classe) especificado recuperado de uma variável de fluxo. |
A interface IFilter tem cinco métodos, descritos na tabela a seguir.
Método | Descrição |
---|---|
IFilter::Init | Inicializa uma sessão de filtragem. |
IFilter::GetChunk | Posiciona IFilter no início da primeira ou próxima parte e retorna um descritor. |
IFilter::GetText | Recupera o texto da parte atual. |
IFilter::GetValue | Recupera valores da parte atual. |
IFilter::BindRegion | Recupera uma interface que representa a parte especificada do objeto . Reservado para uso futuro. |
Processo de isolamento
O Windows Search executa IFilters no contexto de segurança do Sistema Local com direitos restritos. Neste processo de isolamento do host IFilter , vários direitos são removidos:
- Código Restrito
- Todos
- Local
- Interativo
- Usuários Autenticados
- Usuários internos
- SID (identificador de segurança) dos usuários
A remoção desses direitos significa que a interface IFilter não tem acesso ao sistema de disco ou à rede ou a nenhuma interface do usuário ou funções de área de transferência. Além disso, o processo de isolamento é executado em um objeto de trabalho que impede que processos filho sejam criados e impõe um limite de 100 MB no conjunto de trabalho. O processo de isolamento do host da interface IFilter aumenta a estabilidade da plataforma de indexação, devido à possibilidade de filtros de terceiros implementados incorretamente.
Observação
Os manipuladores de filtro devem ser gravados para gerenciar buffers e empilhar corretamente. Todas as cópias de cadeia de caracteres devem ter verificações explícitas para proteger contra estouros de buffer. Você sempre deve verificar o tamanho alocado do buffer. Você sempre deve testar o tamanho dos dados em relação ao tamanho do buffer.
IFilter DLLs
Ifilter As DLLs implementam a interface IFilter para permitir que um cliente extraia informações de texto e valor de propriedade de um tipo de arquivo, classe ou tipo percebido. O processo de filtragem do Windows Search SearchFilterHost.exe associa-se ao IFilter registrado para a classe, tipo percebido ou extensão de nome do item.
Estrutura IFilter
Cada IFilter é um arquivo DLL que implementa um servidor COM (Component Object Model) em processo para fornecer os recursos de filtragem especificados. A figura a seguir ilustra a estrutura geral de um IFilter DLLs típico. Um exemplo mais complexo poderia implementar mais de uma classe IFilter .
Código nativo
Os filtros devem ser escritos em código nativo devido a possíveis problemas de controle de versão do CLR (Common Language Runtime) com o processo em que vários suplementos são executados. No Windows 7 e posterior e posterior, os filtros escritos em código gerenciado são explicitamente bloqueados.
Localizando o identificador de classe IFilter
A classe da DLL IFilter é registrada na chave do Registro PersistentHandler. O exemplo a seguir, para arquivos HTML, ilustra como encontrar a DLL IFilter para um documento HTML. Este exemplo segue uma lógica semelhante à usada pelo sistema para localizar o IFilter associado a um item.
- Verifique se a extensão para o tipo de arquivos que a DLL filtra tem um PersistentHandler registrado na entrada do Registro \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Que essa chave seja
Value1
. Se essa entrada já existir, vá para a etapa 4 deste procedimento e useValue1
nessa chave. Os valores são do tipo REG_SZ.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
.htm
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- Como alternativa, se não houver um PersistentHandler registrado para a extensão, localize o CLSID associado ao tipo de documento na entrada do Registro \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Que essa chave seja
Value2
.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
= Class for WWW HTML files
CLSID
{25336920-03F9-11CF-8FD0-00AA00686F13}
- Determine se um PersistentHandler está registrado para o CLSID. Usando
Value2
determinado na etapa 2, localize o PersistentHandler para a entrada \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2. Que essa chave sejaValue3
.
\HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
= Class for WWW HTML files
PersistentHandler
{EEC97550-47A9-11CF-B952-00AA0051FE20}
- Determine o GUID do manipulador persistente IFilter . Usando
Value1
eValue3
, localize o GUID do Manipulador Persistente IFilter para o tipo de documento. O valor na entrada do Registro \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 ou 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> gera o GUID IFilter PersistentHandler para esse tipo de documento. Que essa chave sejaValue4
. Neste exemplo, o GUID da interface IFilter é 89BCB740-6119-101A-BCB7-00DD010655AF.
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
{EEC97550-47A9-11CF-B952-00AA0051FE20}
= HTML File Persistent Handler
Data type REG_SZ
PersistentAddinsRegistered
{89BCB740-6119-101A-BCB7-00DD010655AF}
Data type REG_SZ
default = {E0CA5340-4534-11CF-B952-00AA0051FE20}
Observação
Neste exemplo, a DLL IFilter para documentos HTML é nlhtml.dll.
IFilter::GetChunk e identificadores de código de localidade
O LCID do texto pode ser alterado em um único arquivo. Por exemplo, o texto de um manual de instrução pode alternar entre inglês (en-us) e espanhol (es) ou o texto pode incluir uma única palavra em um idioma diferente do idioma principal. Em ambos os casos, seu IFilter deve iniciar uma nova parte sempre que o LCID for alterado. Como o LCID é usado para escolher um separador de palavras apropriado, é muito importante identificá-lo corretamente. Se o IFilter não puder determinar a localidade do texto, ele deverá retornar um LCID de zero com a parte. Retornar uma LCID de zero faz com que a Pesquisa do Windows use a tecnologia LAD (Detecção Automática de Linguagem) para determinar a ID de localidade da parte. Se a Pesquisa do Windows não conseguir encontrar uma correspondência, ela usará como padrão a localidade padrão do sistema (chamando a função GetSystemDefaultLocaleName Function ). Para obter mais informações, consulte IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATE e STAT_CHUNK.
Se você controlar o formato do arquivo e ele atualmente não contiver informações de localidade, você deverá adicionar um recurso de usuário para habilitar a identificação de localidade adequada. O uso de um separador de palavras incompatível pode resultar em uma experiência de consulta ruim para o usuário. Para obter mais informações, consulte IWordBreaker.
Observação
Os filtros são associados a tipos de arquivo, conforme indicado por extensões de nome de arquivo, tipos MIME ou CLSIDs. Embora um filtro possa lidar com vários tipos de arquivo, cada tipo funciona com apenas um filtro.
Recursos adicionais
- O exemplo de código IFilterSample , disponível no GitHub, demonstra como criar uma classe base IFilter para implementar a interface IFilter .
- Para obter uma visão geral do processo de indexação, consulte O processo de indexação.
- Para obter uma visão geral dos tipos de arquivo, consulte Tipos de arquivo.
- Para consultar atributos de associação de arquivo para um tipo de arquivo, consulte PerceivedTypes, SystemFileAssociations e Application Registration.
Tópicos relacionados
Desenvolvendo manipuladores de filtro
Práticas recomendadas para criar manipuladores de filtro na Pesquisa do Windows
Retornando propriedades de um manipulador de filtro
Filtrar manipuladores que enviam com o Windows
Implementando manipuladores de filtro na Pesquisa do Windows