Desarrollo de complementos de IFilter

Nota

Windows Desktop Search 2.x es una tecnología obsoleta que originalmente estaba disponible como complemento para Windows XP y Windows Server 2003. En versiones posteriores, use Windows Search en su lugar.

Puedes ampliar Microsoft Windows Desktop Search (WDS) con complementos de filtro, componentes que implementan la interfaz IFilter, para incluir nuevos tipos de archivo. Los filtros son responsables de acceder a los datos y analizarlos en archivos y devolver pares de propiedades y valores, así como fragmentos de texto para la indexación. Durante el proceso de indexación, WDS llama al filtro adecuado con la dirección URL de cada archivo o elemento. El filtro extrae primero los metadatos que corresponden a las propiedades marcadas como recuperables en el esquema WDS, como título, tamaño de archivo y fecha de última modificación. A continuación, divide el contenido del elemento en fragmentos de texto. WDS agrega las propiedades y el texto devueltos por el filtro al catálogo. WDS puede indexar cualquier tipo de archivo para el que tenga un filtro registrado.

En algunas circunstancias, no es necesario escribir un nuevo filtro. WDS 2.x contiene filtros para más de 200 tipos de elementos (incluidos elementos de texto no cifrado como HTML, XML y archivos de código fuente) y usa la misma tecnología IFilterque SharePoint Services. Si ya tiene filtros instalados para los tipos de archivo, WDS puede usar esos filtros existentes para indexar estos datos. Además, WDS incluye un filtro general para los tipos de archivo basados en texto no cifrado. Si tiene un tipo de archivo que se puede procesar mediante un filtro de SharePoint Services existente o el filtro de texto no cifrado, puede agregar la extensión de nombre de archivo y el GUID de filtro al Registro para que WDS pueda buscarlo y usarlo (consulte Para registrar un complemento de filtro para obtener más información).

Sin embargo, si tiene un formato de archivo o datos no sin formato, escribir una implementación de filtro personalizada es la única manera de asegurarse de que WDS puede indexar el formato de archivo en el catálogo. Solo puede tener un complemento de filtro para un tipo de archivo, por lo que es posible invalidar un filtro existente o hacer que otro filtro invalide el suyo para un tipo de archivo específico.

Esta sección contiene los siguientes temas:

Interfaces de filtro necesarias

Un complemento de filtro debe implementar la interfaz IFiltery una de las siguientes interfaces:

  • IPersistStream : para cargar datos desde una secuencia. Esto es más seguro que usar archivos porque no se escribe nada en el disco. La interfaz IPersistStream es el método preferido para la compatibilidad directa con Windows Vista.
  • IPersistFile Interface : para cargar datos de un archivo. Esta interfaz no se admite en Windows Vista.
  • Interfaz IPersistStorage : para cargar datos desde un almacenamiento estructurado OLE COM.

Un complemento de filtro usa estas interfaces para obtener el contenido del elemento y devolverlas de forma iterativa al índice hasta que se alcanza el final del archivo. Un complemento de filtro debe ser lo más sólido posible para controlar archivos dañados y aquellos que no cumplan los formatos de entrada esperados.

IFilter (interfaz)

Se trata de una interfaz necesaria para una implementación de filtro. Para obtener más información, consulte la referencia de la interfaz IFilter.

Método Descripción
Init() Inicializa una sesión de filtrado.
GetChunk() Coloca el filtro al principio del primer o siguiente fragmento y devuelve un descriptor.
GetText() Recupera el texto del fragmento actual.
GetValue() Recupera los valores de propiedad del fragmento actual.
BindRegion() Actualmente reservado para uso interno; no implemente. Este método devuelve E_NOTIMPL.

 

Ipersiststream

Esta interfaz carga un archivo de una secuencia para un procesamiento más seguro que IPersistFile Interface porque el contexto en el que se ejecuta un filtro IPersistStream no necesita los derechos para abrir ningún archivo en el disco o a través de la red. De los dos métodos para acceder a un único archivo, este es el método preferido para la compatibilidad directa con Windows.

Método Descripción
IsDirty() Comprueba si se ha producido un cambio. Este método devuelve E_NOTIMPL en filtros.
InitNew() Crea un nuevo almacenamiento. Este método devuelve E_NOTIMPL en filtros.
Load() Inicializa un objeto desde la secuencia donde se guardó previamente.
Save() Guarda un objeto en la secuencia especificada e indica si el objeto debe restablecer su marca desfasada. Este método devuelve E_NOTIMPL en filtros.
GetSizeMax() Devuelve el tamaño en bytes de la secuencia necesaria para guardar el objeto. Este método devuelve E_NOTIMPL en filtros.

 

IPersistFile

Esta interfaz carga un archivo por ruta de acceso absoluta y no se admite en Windows Vista.

Método Descripción
GetCurFile() Obtiene el nombre actual del archivo asociado al objeto . Devuelve la ruta de acceso especificada en Load().
Load() Abre el archivo especificado e inicializa un objeto del contenido del archivo. Puede retrasar la apertura del archivo hasta que lo necesite.
GetClassID() Devuelve el identificador de clase (CLSID) para el nuevo tipo de archivo. Debe usar uuidgen.exe para generar un CLSID único.
IsDirty() Solo se necesita devolver E_NOTIMPL en filtros
Save() Solo se necesita devolver E_NOTIMPL en filtros
SaveCompleted() Solo se necesita devolver E_NOTIMPL en filtros

 

IPersistStorage

Esta interfaz admite el modelo de almacenamiento estructurado, en el que cada objeto contenido tiene su propio almacenamiento anidado dentro del almacenamiento del contenedor. Al igual que IPersistFile Interface, esta interfaz se carga por ruta de acceso absoluta y no se admite en Windows Vista.

Método Descripción
IsDirty() Comprueba si se ha producido un cambio. Este método devuelve E_NOTIMPL en filtros.
InitNew() Crea un nuevo almacenamiento. Este método devuelve E_NOTIMPL en filtros.
Load() Guarda el almacenamiento. Este método devuelve E_NOTIMPL en filtros.
Save() Devuelve el tamaño en bytes de la secuencia necesaria para guardar el objeto. Este método devuelve E_NOTIMPL en filtros.
SaveCompleted() Reservado para uso interno. Este método devuelve E_NOTIMPL en filtros.
HandsOffStorage() Reservado para uso interno. Este método devuelve E_NOTIMPL en filtros.

 

Salida de propiedades con filtros

El propósito de un filtro es extraer el contenido y las propiedades de los archivos para su inclusión en el índice de texto completo. WDS llama primero al método Load en las implementaciones IPersistFile, IPersistStream o IPersistStorage y, a continuación, invoca el método Init de la implementación de IFilter. Se llama a GetChunk para recuperar fragmentos de datos de texto o valor de propiedad y, a continuación, se llama a GetText o GetValue tantas veces como sea necesario para recuperar todos los valores de texto o propiedad asociados al fragmento. Este proceso se repite hasta que GetChunk informa de que no hay más fragmentos en el documento.

El método GetChunk recupera información sobre el primer o siguiente bloque lógico de información del archivo que se está filtrando y devuelve esa información en una estructura de STAT_CHUNK, incluido un identificador de fragmento que aumenta de forma monotónica, información de estado sobre cómo se relaciona el fragmento actual con el fragmento anterior, una marca que indica si el fragmento contiene texto o un valor, la configuración regional del fragmento y la especificación de la propiedad del fragmento. La especificación de propiedad es un FULLPROPSPEC que consta de un CLSID y un identificador de propiedad entero o de cadena (por ejemplo, D5CDD505-2E9C-101B-9397-08002B2CF9AE/PerceivedType). Identifica el tipo de propiedad en lugar del propio valor de propiedad.

El identificador de configuración regional del fragmento se usa para elegir un separador de palabras adecuado y es muy importante que lo identifique correctamente. Si el filtro no puede determinar la configuración regional del texto, debe asumir la configuración regional del sistema predeterminada, disponible mediante GetSystemDefaultLCID. 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 provocar una experiencia de consulta incorrecta para el usuario.

GetChunk solo administra el acceso a fragmentos y no devuelve el propio valor de texto o propiedad. En su lugar, las llamadas posteriores a GetText y GetValue recuperan el cuerpo del fragmento. GetText devuelve fragmentos de texto, que son cadenas Unicode, del fragmento de CHUNK_TEXT actual. Si el fragmento actual es demasiado grande, se puede requerir más de una llamada al método GetText . Cada llamada al método GetText recupera texto que sigue inmediatamente el texto de la última llamada al método GetText . Por ejemplo, el último carácter de una llamada puede estar en medio de una palabra y el primer carácter de la siguiente llamada continuaría esa palabra. Los motores de búsqueda deben controlar esta situación.

GetValue devuelve valores de propiedad para el fragmento de CHUNK_VALUE actual en estructuras PROPVARIANT, que pueden contener una amplia variedad de tipos de datos. GetValue debe asignar la propia estructura PROPVARIANT mediante CoTaskMemAlloc. El autor de la llamada de GetValue es responsable de liberar memoria a la que apunta el PROPVARIANT mediante PropVariantClear, y para liberar la propia estructura con CoTaskMemFree. Para obtener más información sobre PROPVARIANT, vea la referencia propvariant .

Valores de propiedad

Los filtros deben generar como mínimo las siguientes propiedades que son las columnas predeterminadas en la vista de resultados de WDS.

GUID PROPSPEC Nombre descriptivo Descripción
F29F85E0-4FF9-1068-AB91-08002B27B3D9 2 PrimaryTitle Título que se muestra para este elemento.
F29F85E0-4FF9-1068-AB91-08002B27B3D9 4 PrimaryAuthors Persona más asociada a este elemento.
D5CDD505-2E9C-101B-9397-08002B2CF9AE PrimaryDate PrimaryDate Fecha más importante para el elemento, como la fecha recibida para el correo electrónico o modificada para los archivos.
D5CDD505-2E9C-101B-9397-08002B2CF9AE PerceivedType PerceivedType Tipo de archivo que se analiza. Debe coincidir con uno de los tipos de búsqueda de escritorio de Windows enumerados en tipo percibido de WDS.

 

Para los elementos de texto no cifrado, WDS extrae todo el texto y las propiedades definidas por el sistema, como el tamaño de archivo o la extensión en la inclusión de nuevos tipos de archivo de texto no cifrado en el índice). Otros tipos de propiedades que se pueden devolver al índice incluyen:

  • Para los archivos: autor, título, estado, palabras clave
  • Para medios: álbum, género, marca de cámara, fecha tomada
  • Para las comunicaciones: de a, cc, importancia
  • Para contactos: puesto de trabajo, teléfono empresarial, empresa

La lista anterior agrupa las propiedades comunes a un tipo percibido especificado; sin embargo, cualquier propiedad se puede usar independientemente del tipo. Por ejemplo, la empresa podría usarse para el nombre del empleador de un contacto y también se podría usar para hacer referencia al nombre de un cliente al que se relaciona el archivo. Muchas de estas propiedades se usan para mostrar los resultados de búsqueda en la vista de resultados de WDS. Por ejemplo, la propiedad Title de un archivo se muestra como la columna principal en la vista de resultados predeterminada. Los objetos IFilter deben generar todas las propiedades relacionadas con el tipo de elemento que analizan. Las propiedades personalizadas no se pueden agregar en WDS 2.x. Para obtener una lista completa de las propiedades disponibles, consulte el esquema WDS.

Instalación de complementos de filtro

La instalación del filtro implica copiar el archivo DLL en una ubicación adecuada en el directorio Archivos de programa y registrarlo. Los filtros deben implementar el registro propio para la instalación y deben seguir estas directrices:

  • El instalador debe usar el instalador EXE o MSI.
  • Se deben proporcionar notas de la versión.
  • Se debe crear una entrada Agregar o quitar programas para cada complemento instalado.
  • El instalador debe asumir toda la configuración del Registro para el tipo de archivo determinado o almacenar que comprende el complemento actual.
  • Si se sobrescribe un complemento anterior, el instalador debe notificar al usuario.
  • Si un complemento más reciente ha sobrescribido el complemento anterior, debe haber la capacidad de restaurar la funcionalidad del complemento anterior y convertirlo en el complemento predeterminado para ese tipo de archivo o almacenarlo de nuevo.

CLSID necesarios para el registro

Hay tres identificadores de clase, o CLSID, asociados a cada filtro. Deberá generar uno o varios de estos (use uuidgen.exe) para registrar el complemento de filtro.

  • El primero identifica el controlador persistente de todos los filtros, IID_IFilter, que es {89BCB740-6119-101A-BCB7-00DD010655AF}. Este CLSID es constante para todos los filtros que implementan IFilter.
  • El segundo (el valor de la clave IID_IFilter) identifica la implementación de IFilter para el tipo de archivo. Esta clave contiene un valor InprocServer32 que especifica el nombre dll por ruta de acceso y el modelo de subprocesos. Si el filtro está en la ruta de acceso del sistema, como el directorio system32, un nombre de archivo es suficiente. De lo contrario, este valor debe tener una especificación de ruta de acceso completa.
  • El tercero identifica el tipo de archivo que procesa el filtro y lo devuelve el método GetClassID en la interfaz IPersist.

Nota

En futuras versiones de sistemas operativos de Microsoft, la instalación de archivos en el directorio system32 puede resultar más difícil, por lo que se recomienda instalarlos en Archivos de programa e incluir una ruta de acceso completa al filtro en el registro. Por motivos de seguridad, también es prudente especificar una ruta de acceso completa a la DLL en el registro. De lo contrario, se podría cargar una versión de "Caballo de Troya" del archivo DLL si ocurre que está en la ruta de acceso del proceso antes de la versión.

 

Modelo de registro

Cuando WDS está listo para filtrar un archivo, busca en el Registro en la extensión del archivo para determinar qué filtro se va a cargar. A continuación, sigue una serie de vínculos del Registro para buscar el nombre del archivo DLL de filtro, en este orden:

  1. Desde CLSID ubicados en:

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

  2. Desde el tipo de contenido del archivo en:

    HKEY_LOCAL_MACHINE\SOFTWARE\Classes\MIME\Database\Content Type

  3. Desde la extensión de nombre de archivo (igual que la API LoadIFilter de Win32) en:

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Override\RSApp

    HKEY_CURRENT_USER\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

    HKEY_CLASSES_ROOT\extpersistentHandler-CLSID-IID_IFilter-CLSID>>>

  4. De forma predeterminada en:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters

Para registrar un complemento de filtro

Debe realizar un total de ocho entradas en el Registro para registrar el complemento de filtro, donde:

  • .ext es la nueva extensión de nombre de archivo.
  • GUID_1 puede ser cualquier GUID nuevo generado para esta extensión.
  • 89BCB740-6119-101A-BCB7-00DD010655AF es el GUID de la interfaz IFilter, que es una constante para todas las implementaciones de IFilter.
  1. Registre el controlador persistente para la extensión de nombre de archivo con las siguientes claves y valores:

    HKEY_CLASSES_ROOT\<.ext>\PersistentHandler
       (Default) = {GUID_1}
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}
       (Default) = <Persistent Handler Description>
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered
       (Default) = (Value Not Set)
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentAddinsRegistered\{89BCB740-6119-101A-BCB7-00DD010655AF}
       (Default) = {CLSID of IFilter implementation}
    
    HKEY_CLASSES_ROOT\CLSID\{GUID_1}\PersistentHandler
       (Default) = {GUID_1}
    
  2. Registre la implementación de IFilter con las siguientes claves y valores:

    HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}
       (Default) = Extension IFilter Description">
    
    HKEY_CLASSES_ROOT\CLSID\{CLSID of IFilter implementation}\InprocServer32
       (Default) = <DLL Install Path>
       ThreadingModel = Both
    
  3. Registre la implementación de IFilter con Windows Desktop Search con la siguiente clave y valor:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\RSSearch\ContentIndexCommon\Filters\Extension\<.ext>
       (Default) = {CLSID of IFilter implementation}"
    

Referencia

SchemaTable

Tipos percibidos

Desarrollo de controladores de protocolo

Otros recursos

Ifilter