Compartir a través de


Descripción de los controladores de filtro en Windows Search

Los controladores de filtro, que son implementaciones de la interfaz IFilter , examinan documentos para buscar texto y propiedades. Los controladores de filtro extraen fragmentos de texto de estos elementos, filtran el formato incrustado y conservan información sobre la posición del texto. También extraen fragmentos de valores, que son propiedades del documento. IFilter es la base para crear aplicaciones de nivel superior, como indexadores de documentos y visores independientes de la aplicación.

Este tema se organiza de la siguiente manera:

Acerca de la interfaz IFilter

Búsqueda de Microsoft Windows usa filtros para extraer el contenido de los elementos para su inclusión en un índice de texto completo. Puede ampliar Windows Search para indexar tipos de archivo nuevos o propietarios escribiendo filtros para extraer el contenido y controladores de propiedades para extraer las propiedades de los archivos.

La interfaz IFilter está diseñada para satisfacer las necesidades específicas de los motores de búsqueda de texto completo. Los motores de búsqueda de texto completo, como Windows Search, llaman a los métodos IFilter para extraer texto e información de propiedades y agregarlos a un índice. Windows Search divide los resultados del método IFilter::GetText devuelto en palabras, los normaliza y los guarda en un índice. Si está disponible, el motor de búsqueda usa el identificador de código de idioma (LCID) de un fragmento de texto para realizar la separación y normalización de palabras específicas del lenguaje.

Windows Search usa tres funciones, que se describen en la tabla siguiente, para acceder a los controladores de filtro registrados (implementaciones de la interfaz IFilter ). Estas funciones son especialmente útiles al cargar y enlazar con el controlador de filtros de un objeto incrustado.

Función Descripción
LoadIFilter Obtiene un puntero al IFilter que es más adecuado para el tipo de contenido especificado.
BindIFilterFromStorage Obtiene un puntero al IFilter que es más adecuado para el contenido contenido contenido en un objeto IStorage Interface .
BindIFilterFromStream Obtiene un puntero al IFilter que es más adecuado para un identificador de clase especificado (CLSID) recuperado de una variable de secuencia.

La interfaz IFilter tiene cinco métodos, que se describen en la tabla siguiente.

Método Descripción
IFilter::Init Inicializa una sesión de filtrado.
IFilter::GetChunk Coloca IFilter al principio del primer o siguiente fragmento y devuelve un descriptor.
IFilter::GetText Recupera el texto del fragmento actual.
IFilter::GetValue Recupera valores del fragmento actual.
IFilter::BindRegion Recupera una interfaz que representa la parte especificada del objeto . Reservado para uso futuro.

Proceso de aislamiento

Windows Search ejecuta IFilters en el contexto de seguridad del sistema local con derechos restringidos. En este proceso de aislamiento de host IFilter , se quitan varios derechos:

  • Código restringido
  • Todos
  • Local
  • Interactive
  • Usuarios autenticados
  • Usuarios integrados
  • Identificador de seguridad (SID) de los usuarios

La eliminación de estos derechos significa que la interfaz IFilter no tiene acceso al sistema de disco o a la red ni a ninguna interfaz de usuario o funciones del Portapapeles. Además, el proceso de aislamiento se ejecuta bajo un objeto de trabajo que impide que se creen procesos secundarios e impone un límite de 100 MB en el conjunto de trabajo. El proceso de aislamiento de host de interfaz IFilter aumenta la estabilidad de la plataforma de indexación, debido a la posibilidad de implementar filtros de terceros incorrectamente.

Nota

Los controladores de filtro deben escribirse para administrar los búferes y apilar correctamente. Todas las copias de cadena deben tener comprobaciones explícitas para protegerse contra las saturaciones del búfer. Siempre debe comprobar el tamaño asignado del búfer. Siempre debe probar el tamaño de los datos con respecto al tamaño del búfer.

ARCHIVOS DLL de IFilter

Ifilter Los archivos DLL implementan la interfaz IFilter para permitir que un cliente extraiga información de valor de propiedad y texto de un tipo de archivo, clase o tipo percibido. El proceso de filtrado de Windows Search SearchFilterHost.exe se enlaza al IFilter registrado para la clase, el tipo percibido o la extensión de nombre del elemento.

IFilter (estructura)

Cada IFilter es un archivo DLL que implementa un servidor del Modelo de objetos componentes (COM) en proceso para proporcionar las funcionalidades de filtrado especificadas. En la ilustración siguiente se muestra la estructura general de un archivo DLL de IFilter típico. Un ejemplo más complejo podría implementar más de una clase IFilter .

diagrama de la estructura de un archivo DLL de ifilter típico

Código nativo

Los filtros deben escribirse en código nativo debido a posibles problemas de control de versiones de Common Language Runtime (CLR) con el proceso en el que se ejecutan varios complementos. En Windows 7 y versiones posteriores y posteriores, los filtros escritos en código administrado se bloquean explícitamente.

Buscar el identificador de clase IFilter

La clase del archivo DLL de IFilter se registra en la clave del Registro PersistentHandler. En el ejemplo siguiente, para archivos HTML, se muestra cómo buscar el archivo DLL de IFilter para un documento HTML. En este ejemplo se sigue la lógica similar a la usada por el sistema para buscar el IFilter asociado a un elemento.

  1. Compruebe si la extensión para el tipo de archivos que filtra el archivo DLL tiene un PersistentHandler registrado en la entrada del Registro \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Deje que esta clave sea Value1. Si esa entrada ya existe, vaya al paso 4 de este procedimiento y úselo Value1 en esa clave. Los valores son de tipo REG_SZ.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Como alternativa, si no hay un PersistentHandler registrado para la extensión, busque el CLSID asociado al tipo de documento en la entrada del Registro \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Deje que esta clave sea Value2.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                CLSID
                   {25336920-03F9-11CF-8FD0-00AA00686F13}
  1. Determine si persistentHandler está registrado para el CLSID. Con Value2 determinado en el paso 2, busque persistentHandler para la entrada \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2. Deje que esta clave sea Value3.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Determine el GUID del controlador persistente de IFilter . Con Value1 y Value3, busque el GUID del controlador persistente de IFilter para el tipo de documento. El valor en la entrada del Registro \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 o 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> produce el GUID persistentHandler de IFilter para este tipo de documento. Deje que esta clave sea Value4. En este ejemplo, el GUID de la interfaz IFilter es 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}

Nota

En este ejemplo, el archivo DLL de IFilter para documentos HTML es nlhtml.dll.

Identificadores de código IFilter::GetChunk y configuración regional

El LCID de texto puede cambiar dentro de un único archivo. Por ejemplo, el texto de un manual de instrucciones podría alternar entre inglés (en-us) y español (es) o el texto puede incluir una sola palabra en un idioma distinto del idioma principal. En cualquier caso, el IFilter debe comenzar un nuevo fragmento cada vez que cambie el LCID. Dado que el LCID se usa para elegir un separador de palabras adecuado, es muy importante que lo identifique correctamente. Si el IFilter no puede determinar la configuración regional del texto, debe devolver un LCID de cero con el fragmento. Devolver un LCID de cero hace que Windows Search use la tecnología de detección automática de idioma (LAD) para determinar el identificador de configuración regional del fragmento. Si Windows Search no encuentra una coincidencia, el valor predeterminado es la configuración regional predeterminada del sistema (mediante una llamada a la función GetSystemDefaultLocaleName). Para obtener más información, vea IFilter::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATE y STAT_CHUNK.

Si controla el formato de archivo y actualmente no contiene información de configuración regional, debe agregar una característica de usuario para habilitar la identificación de configuración regional adecuada. El uso de un separador de palabras no coincidente puede dar lugar a una mala experiencia de consulta para el usuario. Para obtener más información, vea IWordBreaker.

Nota

Los filtros están asociados a tipos de archivo, como se indica en extensiones de nombre de archivo, tipos MIME o CLSID. Aunque un filtro puede controlar varios tipos de archivo, cada tipo solo funciona con un filtro.

Recursos adicionales

Desarrollo de controladores de filtros

Procedimientos recomendados para crear controladores de filtro en Windows Search

Devolver propiedades de un controlador de filtros

Controladores de filtro que se envían con Windows

Implementación de controladores de filtro en Windows Search

Registro de controladores de filtro

Probar controladores de filtro