Registrando manipuladores de filtro
Seu manipulador de filtro deve ser registrado. Você também pode localizar um manipulador de filtro existente para uma determinada extensão de nome de arquivo por meio do registro ou usando a interface ILoadFilter .
Este tópico é organizado da seguinte maneira:
- Registrando manipuladores de filtros para a pesquisa do Windows
- Substituindo manipuladores de filtro existentes
- Localizando um manipulador de filtro para uma determinada extensão de arquivo
- Recursos adicionais
- Tópicos relacionados
Observação
Um manipulador de filtro é uma implementação da interface IFilter .
Registrando manipuladores de filtros para a pesquisa do Windows
Os GUIDs necessários para registrar um novo manipulador de protocolo ou para localizar um manipulador de protocolo existente estão listados na tabela a seguir.
GUID | Usuário ou aplicativo definido | Descrição |
---|---|---|
89BCB740-6119-101A-BCB7-00DD010655AF | Aplicativo | O GUID da interface IFilter é uma constante de chave do Registro para todos os manipuladores de filtro. |
{PersistentHandlerGUID} | Usuário | Esse é o GUID para o manipulador persistente. |
{FilterHandlerCLSID} | Usuário | Esse é o CLSID (identificador de classe) do manipulador de filtro. |
{ApplicationGUID} | Usuário | Esse é um GUID intermediário (agregado). |
Os manipuladores de filtro devem ser registrados em HKEY_LOCAL_MACHINE porque SearchFilterHost.exe está em execução na conta SYSTEM e, portanto, não podem acessar chaves do Registro para HKEY_CURRENT_USER para o usuário conectado. Além disso, o grupo Usuários deve ter acesso de leitura e execução ao manipulador de filtro .dll próprio porque SearchFilterHost.exe remove todos os direitos de administrador e permite apenas direitos de não administrador. Como o local de projeto padrão do Visual Studio está no diretório do usuário atual e, portanto, não fornece permissões de leitura para o grupo Usuários, você deve mover o .dll ou alterar as ACLs para permitir SearchFilterHost.exe acesso.
Ao registrar um novo manipulador de filtro, recomendamos que você use um nome descritivo, por exemplo, IFilter HTML.
Para registrar seu novo manipulador de filtro:
- Especifique a extensão e o GUID do manipulador persistente que usarão o manipulador de filtro:
HKEY_LOCAL_MACHINE
Software
Classes
.txt
PersistentHandler
(Default) = {PersistentHandlerGUID}
HKEY_LOCAL_MACHINE
Software
Classes
CLSID
{PersistentHandlerGUID}
PersistentAddinsRegistered
{89BCB740-6119-101A-BCB7-00DD010655AF}l
(Default) = {FilterHandlerCLSID}
- Registre o manipulador de filtro com as seguintes chaves e valores:
HKEY_LOCAL_MACHINE
Software
Classes
CLSID
{FilterHandlerCLSID}
(Default) = {DescriptiveFilterHandlerName}
InprocServer32
(Default) = DLL Install Path
ThreadingModel = Both
Abordagem obsoleta para registrar manipuladores de filtros
Essa abordagem não é recomendada para uso. Os filtros podem ser registrados para um CLSID que representa uma classe COM (Component Object Model) e/ou para uma extensão de nome de arquivo. Você poderá registrar os dois filtros se precisar registrar um manipulador de filtro para uma classe e um manipulador de filtro diferente para uma extensão de nome de arquivo dentro da classe . Observe que um manipulador de filtro registrado para uma extensão de nome de arquivo tem precedência sobre um manipulador de filtro para um CLSID.
Essas entradas são entradas padrão do Registro OLE até e incluindo a entrada para a classe CLSID\{ApplicationGUID}. A sample.dll DLL implementa o comportamento do objeto em execução para a classe .txt. Observe a entrada extra, PersistentHandler. Essa entrada especifica a classe responsável por intermediar solicitações para os objetos persistentes da classe de exemplo. A entrada em PersistentAddinsRegistered identifica a implementação responsável pela interface chamada 89BCB740-6119-101A-BCB7-00DDD010655AF(IID_IFilter). A classe que implementa IID_IFilter tem entradas padrão do Registro OLE. A DLL InprocServer32 é carregada por meio do mecanismo OLE padrão.
A Pesquisa do Windows observa o modelo de threading especificado para o manipulador de filtro. Quando o modelo de threading é definido como Ambos, o manipulador de filtro deve ser thread-safe; caso contrário, se não for thread-safe, especifique Apartment. Observe que os manipuladores de filtro devem ser sempre thread-safe.
As entradas de registro de exemplo a seguir são para um manipulador de filtro registrado para uma extensão de classe e nome de arquivo. {PersistentHandlerGUID} e {FilterHandlerCLSID} são usados como variáveis que indicam valores que precisam ser especificados pelo criador do manipulador de filtro. Os valores são do tipo REG_SZ.
HKEY_LOCAL_MACHINE
Software
Classes
.txt
(Default) = SampleFile
SampleFile
(Default) = Class for Sample Files
CLSID
(Default) = {ApplicationGUID}
CLSID
{ApplicationGUID}
(Default) = Sample Files
InprocServer32
(Default) = sample.dll
PersistentHandler
(Default) = {PersistentHandlerGUID}
{PersistentHandlerGUID}
(Default) = Sample file persistent handler
PersistentAddinsRegistered
{89BCB740-6119-101A-BCB7-00DD010655AF}l
(Default) = {FilterHandlerCLSID}
{FilterHandlerCLSID}
(Default) = Sample Files
InprocServer32
(Default) = sampfilt.dll
ThreadingModel = Both
Substituindo manipuladores de filtro existentes
Recomendamos que você não substitua os manipuladores de filtro internos para tipos de arquivo comuns, como .txt, .doc, .html, .url e assim por diante, pois isso pode ter efeitos indesejados em outros componentes do sistema. A indexação de corpos de mensagens de email depende dos manipuladores de filtros .txt, .html e .rtf, por exemplo.
Se um novo manipulador de filtro para um tipo de arquivo estiver sendo instalado como uma substituição para um registro de filtro existente, o instalador deverá salvar o registro atual e restaurá-lo se o novo manipulador de filtro estiver desinstalado. Não há mecanismo para encadear filtros. Portanto, o novo manipulador de filtro é responsável por replicar qualquer funcionalidade necessária do filtro antigo.
Localizando um manipulador de filtro para uma determinada extensão de arquivo
Você pode usar a interface ILoadFilter para encontrar um manipulador de filtro para uma determinada extensão de nome de arquivo. As entradas de registro de exemplo a seguir ilustram como fazer isso para arquivos HTML. Neste exemplo, o manipulador de filtro para documentos HTML é nlhtml.dll. Os valores são do tipo REG_SZ.
Para localizar o manipulador de filtro para uma determinada extensão de nome de arquivo:
- Verifique se a extensão para o tipo de arquivos filtrados tem um manipulador persistente registrado na entrada do Registro \HKEY_LOCAL_MACHINE\SOFTWARE\Classes.extension. Nesse caso, deixe essa chave ser {PersistentHandlerGUID}.
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
.htm
PersistentHandler
{PersistentHandlerGUID}
- Se não houver um manipulador persistente 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 {ApplicationGUID}. Em seguida, determine se um manipulador persistente está registrado para o CLSID: usando {ApplicationGUID} localize o manipulador persistente para a entrada \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{ApplicationGUID}. Que essa chave seja {PersistentHandlerGUID}.
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
htmlfile
(Default) = Class for WWW HTML files
CLSID
(Default) = {25336920-03F9-11CF-8FD0-00AA00686F13}
CLSID
{25336920-03F9-11CF-8FD0-00AA00686F13}
PersistentHandler
(Default) = {PersistentHandlerGUID}
- Determine o GUID do manipulador persistente: usando {PersistentHandlerGUID} localize o GUID do manipulador persistente para o tipo de documento. O valor na entrada do Registro HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{PersistentHandlerGUID}\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DDD010655AF produz o GUID do manipulador persistente para esse tipo de documento. Deixe essa chave ser {FilterHandlerCLSID}.
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
{PersistentHandlerGUID}
(Default) = HTML File Persistent Handler<dl>
REG_SZ {89BCB740-6119-101A-BCB7-00DD010655AF}
REG_SZ (Default) = {EEC97550-47A9-11CF-B952-00AA0051FE20}
- Determine o manipulador de filtro: usando {FilterHandlerCLSID} que foi determinado na etapa anterior, localize o manipulador de filtro na entrada \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{FilterHandlerCLSID}\InprocServer32. Neste exemplo, o nome do manipulador de filtro descritivo usado é IFilter HTML.
HKEY_LOCAL_MACHINE
SOFTWARE
Classes
CLSID
{EEC97550-47A9-11CF-B952-00AA0051FE20}
(Default) = HTML IFilter
Data type REG_SZ
InprocServer32
nlhtml.dll
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
Sobre manipuladores de filtro na Pesquisa do Windows
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