Présentation des gestionnaires de filtres dans Windows Search

Gestionnaires de filtres, qui sont des implémentations de l’interface IFilter, analysent les documents pour le texte et les propriétés. Les gestionnaires de filtre extraient des blocs de texte à partir de ces éléments, filtrent la mise en forme incorporée et conservent des informations sur la position du texte. Ils extraient également des blocs de valeurs, qui sont des propriétés de document. IFilter est la base de la création d’applications de niveau supérieur, telles que les indexeurs de documents et les visionneuses indépendantes des applications.

Cette rubrique est organisée comme suit :

À propos de l’interface IFilter

Microsoft Windows Search utilise des filtres pour extraire le contenu des éléments à inclure dans un index de recherche en texte intégral. Vous pouvez étendre Windows Search pour indexer des types de fichiers nouveaux ou propriétaires en écrivant des filtres pour extraire le contenu et des gestionnaires de propriétés pour extraire les propriétés des fichiers.

L’interface IFilter est conçue pour répondre aux besoins spécifiques des moteurs de recherche en texte intégral. Les moteurs de recherche en texte intégral comme Windows Search appellent les méthodes IFilter pour extraire du texte et des informations de propriété et les ajouter à un index. Windows Search divise les résultats de la méthode IFilter::GetText en mots, les normalise et les enregistre dans un index. S’il est disponible, le moteur de recherche utilise l’identificateur de code de langue (LCID) d’un bloc de texte pour effectuer une rupture et une normalisation de mots spécifiques à la langue.

Windows Search utilise trois fonctions, décrites dans le tableau suivant, pour accéder aux gestionnaires de filtres inscrits (implémentations de l’interface IFilter ). Ces fonctions sont particulièrement utiles lors du chargement et de la liaison au gestionnaire de filtre d’un objet incorporé.

Fonction Descriptif
LoadIFilter Obtient un pointeur vers le IFilter qui convient le mieux au type de contenu spécifié.
BindIFilterFromStorage Obtient un pointeur vers le IFilter qui convient le mieux au contenu contenu dans un objet IStorage Interface .
BindIFilterFromStream Obtient un pointeur vers le IFilter qui convient le mieux à un identificateur de classe spécifié (CLSID) récupéré à partir d’une variable de flux.

L’interface IFilter a cinq méthodes, décrites dans le tableau suivant.

Méthode Descriptif
IFilter ::Init Initialise une session de filtrage.
IFilter ::GetChunk Positionne IFilter au début du premier ou du bloc suivant et retourne un descripteur.
IFilter ::GetText Récupère du texte à partir du bloc actuel.
IFilter ::GetValue Récupère les valeurs du bloc actuel.
IFilter ::BindRegion Récupère une interface représentant la partie spécifiée de l’objet. Réservé pour une utilisation ultérieure.

Processus d’isolation

Windows Search exécute des IFilters dans le contexte de sécurité du système local avec des droits restreints. Dans ce processus d’isolation de l’hôte IFilter , plusieurs droits sont supprimés :

  • Code restreint
  • Tout le monde
  • Local
  • Interactif
  • Utilisateurs authentifiés
  • Utilisateurs intégrés
  • Identificateur de sécurité des utilisateurs (SID)

La suppression de ces droits signifie que l’interface IFilter n’a pas accès au système de disque ou au réseau, ni à une interface utilisateur ou à des fonctions presse-papiers. En outre, le processus d’isolation s’exécute sous un objet de tâche qui empêche la création de processus enfants et impose une limite de 100 Mo sur l'ensemble de travail. Le processus d’isolation de l’hôte de l’interface IFilter augmente la stabilité de la plateforme d’indexation, en raison de la possibilité d’implémentation incorrecte de filtres tiers.

Note

Les gestionnaires de filtre doivent être écrits pour gérer les mémoires tampons et la pile correctement. Toutes les copies de chaîne doivent avoir des vérifications explicites pour se protéger contre les débordements de mémoire tampon. Vous devez toujours vérifier la taille allouée de la mémoire tampon. Vous devez toujours tester la taille des données par rapport à la taille de la mémoire tampon.

IFilter DLL

IFilter Les DLL implémentent l’interface IFilter pour permettre à un client d’extraire des informations de texte et de valeur de propriété à partir d’un type de fichier, d’une classe ou d’un type perçu. Le processus de filtrage Windows Search SearchFilterHost.exe se lie à l'IFilter inscrit pour la classe, le type détecté ou l'extension de nom de l'élément.

Structure IFilter

Chaque IFilter est un fichier DLL qui implémente un serveur COM (Component Object Model) in-process pour fournir les fonctionnalités de filtrage spécifiées. La figure suivante illustre la structure globale d’une DLL IFilter classique. Un exemple plus complexe peut implémenter plusieurs classes IFilter .

diagramme de la structure d’une dll ifilter classique

Code natif

Les filtres doivent être écrits en code natif en raison de problèmes potentiels de versionnage CLR (Common Language Runtime) avec le processus où s'exécutent plusieurs compléments. Dans Windows 7 et versions ultérieures, les filtres écrits dans le code managé sont explicitement bloqués.

Recherche de l’identificateur de classe IFilter

La classe de la DLL IFilter est inscrite sous la clé de Registre PersistentHandler. L’exemple suivant, pour les fichiers HTML, montre comment rechercher la DLL IFilter pour un document HTML. Cet exemple suit une logique similaire à celle utilisée par le système pour rechercher le IFilter associé à un élément.

  1. Vérifiez si l’extension pour le type de fichiers que les filtres DLL possède un Gestionnaire persistant inscrit sous l’entrée de Registre \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Laissez cette clé être Value1. Si cette entrée existe déjà, passez à l’étape 4 de cette procédure et utilisez Value1 dans cette clé. Les valeurs sont de type REG_SZ.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             .htm
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Sinon, s’il n’existe pas de gestionnaire persistant inscrit pour l’extension, recherchez le CLSID associé au type de document sous l’entrée de Registre \HKEY_LOCAL_MACHINE\SOFTWARE\Classes. Laissez cette clé être Value2.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                CLSID
                   {25336920-03F9-11CF-8FD0-00AA00686F13}
  1. Déterminez si un PersistentHandler est enregistré pour le CLSID. En utilisant Value2 déterminé à l'étape 2, trouvez le Handler persistant pour l'entrée \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value2. Laissez cette clé être Value3.
    \HKEY_LOCAL_MACHINE
       SOFTWARE
          Classes
             htmlfile
                 = Class for WWW HTML files
                PersistentHandler
                   {EEC97550-47A9-11CF-B952-00AA0051FE20}
  1. Déterminez le GUID du gestionnaire persistant IFilter . Utilisez Value1 et Value3, recherchez le GUID du gestionnaire persistant IFilter pour le type de document. La valeur sous l’entrée de Registre \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\Value1 ou 3\PersistentAddinsRegistered\ 89BCB740-6119-101A-BCB7-00DD010655AF"/> génère le GUID IFilter PersistentHandler pour ce type de document. Laissez cette clé être Value4. Dans cet exemple, le GUID de l’interface IFilter est 89BCB740-6119-101A-BCB7-00DDD010655AF.
    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}

Note

Dans cet exemple, la DLL IFilter pour les documents HTML est nlhtml.dll.

IFilter ::GetChunk et identificateurs de codes de paramètres régionaux

Le LCID du texte peut changer dans un seul fichier. Par exemple, le texte d’un manuel d’instructions peut alterner entre l’anglais (en-us) et l’espagnol (es) ou le texte peut inclure un seul mot dans une langue autre que la langue primaire. Dans les deux cas, votre IFilter doit commencer un nouveau bloc chaque fois que le LCID change. Étant donné que le LCID est utilisé pour choisir un séparateur de mots approprié, il est très important que vous l’identifiez correctement. Si le IFilter ne peut pas déterminer les paramètres régionaux du texte, il doit retourner un LCID de zéro avec le bloc. Le renvoi d’un LCID de zéro entraîne l’utilisation de la technologie de détection automatique de la langue (LAD) de Windows Search pour déterminer l’ID de la langue du bloc. Si la recherche Windows ne trouve pas de correspondance, elle passe par défaut aux paramètres régionaux du système (en appelant la fonction GetSystemDefaultLocaleName ). Pour plus d’informations, consultez IFilter ::GetChunk, CHUNK_BREAKTYPE, CHUNKSTATE et STAT_CHUNK.

Si vous contrôlez le format de fichier et qu’il ne contient actuellement pas d’informations sur les paramètres régionaux, vous devez ajouter une fonctionnalité utilisateur pour activer l’identification appropriée des paramètres régionaux. L’utilisation d’un segmentateur de mots mal adapté peut entraîner une mauvaise expérience de requête pour l’utilisateur. Pour plus d’informations, consultez IWordBreaker.

Note

Les filtres sont associés aux types de fichiers, comme indiqué par les extensions de nom de fichier, les types MIME ou les CLSID. Bien qu’un filtre puisse gérer plusieurs types de fichiers, chaque type fonctionne avec un seul filtre.

Ressources supplémentaires

Développement de gestionnaires de filtres

Meilleures pratiques pour la création de gestionnaires de filtres dans Windows Search

Retour de propriétés à partir d’un gestionnaire de filtres

Gestionnaires de filtres fournis avec Windows

Implémentation de gestionnaires de filtres dans Windows Search

Inscription de gestionnaires de filtres

Test des gestionnaires de filtres