Compartilhar via


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

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 .

diagrama da estrutura de uma dll ifilter típica

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.

  1. 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 use Value1 nessa chave. Os valores são do tipo REG_SZ.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. 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}
  1. 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 seja Value3.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Determine o GUID do manipulador persistente IFilter . Usando Value1 e Value3, 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 seja Value4. 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

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

Registrando manipuladores de filtro

Testando manipuladores de filtro