Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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 blocos de valores, que são propriedades de 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 dos 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á-los a um índice. A Pesquisa do Windows 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 usará 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 vincular ao manipulador de filtro de um objeto inserido.
| Função | Description |
|---|---|
| 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 | Description |
|---|---|
| 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 do bloco atual. |
| IFilter::GetValue | Recupera valores do bloco 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 incorporados
- 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 a criação de processos filho 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 empilhados corretamente. Todas as cópias de cadeia de caracteres devem ter verificações explícitas para proteger contra sobrecargas 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 da Pesquisa do Windows SearchFilterHost.exe associa-se ao IFilter registrado para a classe, o tipo percebido ou a 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 Common Language Runtime (CLR) no processo em que vários add-ins são executados. No Windows 7 e posteriores, 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 localizar a DLL de 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 do 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, pule para a etapa 4 deste procedimento e useValue1nessa 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
Value2determinado 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
Value1eValue3, 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 este 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.
Identificadores de código do IFilter::GetChunk e códigos de localidade
O LCID do texto pode ser alterado em um único arquivo. Por exemplo, o texto de um manual de instruções pode alternar entre inglês (en-us) e espanhol (es) ou o texto pode incluir uma única palavra em um idioma diferente do idioma primário. Em ambos os casos, o 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 uma 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 Idioma) para determinar a ID de localidade da parte. Se o Windows Search não conseguir encontrar uma correspondência, ele usará como padrão a localidade padrão do sistema (chamando a função GetSystemDefaultLocaleName ). Para obter mais informações, consulte IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATE e STAT_CHUNK.
Se você controlar o formato de 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 manipular 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
Manipuladores de Filtro que Vêm com o Windows
Implementando manipuladores de filtro na Pesquisa do Windows