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:

Observação

Um manipulador de filtro é uma implementação da interface IFilter .

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:

  1. 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}
  1. 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:

  1. 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}
  1. 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}
  1. 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}
  1. 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

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

Testando manipuladores de filtro