Implémentation de gestionnaires de filtres dans Windows Search

Il est important de comprendre la structure DLL requise d’un gestionnaire de filtres (implémentation de l’interface IFilter ).

Cette rubrique est organisée comme suit :

Implémentation et exportation des points d’entrée DLL

Chaque DLL IFilter (indiquée par Ifilter.dll dans cette section) doit implémenter et exporter les points d’entrée suivants. Ces points d’entrée sont généralement exportés à l’aide d’un fichier de définition de module (.def) pour l’interface IFilter ou à l’aide du mot clé __declspec(dllexport). Le fichier DLL peut être inscrit dans n’importe quel dossier, mais il réside généralement dans le dossier %SystemRoot%\system32.

Les points d’entrée DLL sont répertoriés et décrits dans le tableau suivant.

Nom de la DLL Description de la DLL
DllRegisterServer Le point d’entrée DllRegisterServer inscrit la DLL en tant que filtre dans le Registre. Vous inscrivez la DLL en exécutant le programme regsvr32.exe avec le nom de fichier DLL de l’interface IFilter en tant qu’argument : regsvr32.exe %SystemRoot%\system32\Ifilter.dll
DllUnregisterServer, fonction Le point d’entrée de la fonction DllUnregisterServer supprime la DLL en tant que gestionnaire persistant dans le Registre. Vous annulez l’inscription de la DLL en exécutant le programme regsvr32.exe avec l’indicateur /u : regsvr32.exe /u %SystemRoot%\system32\Ifilter.dll
DllGetClassObject, fonction Le client d’indexation de contenu appelle le point d’entrée de la fonction DllGetClassObject , par le biais de Component Object Model (COM), pour créer un objet de fabrique de classes pour l’interface IFilter et obtenir un pointeur vers l’interface de fabrique de classe de cet objet.
Fonction DllCanUnloadNow Le client d’indexation de contenu appelle le point d’entrée de la fonction DllCanUnloadNow , via COM, pour déterminer s’il est possible de décharger la DLL IFilter . L’interface IFilter est déchargée une fois qu’elle n’est pas utilisée pendant un intervalle de temps, comme spécifié par la valeur de Registre FilterIdleTimeOut.

Implémentation de la classe IFilter et de la fabrique de classes

Au moins deux classes, telles que CFilter et CFilterCF, sont généralement implémentées par chaque DLL IFilter . La classe CFilter produit l’objet d’interface IFilter qui implémente la fonctionnalité de filtrage de contenu. Ses fonctions membres implémentent les méthodes d’interface de l’interface IFilter . Chaque classe IFilter nécessite un identificateur de classe unique (CLSID), que l’implémenteur d’interface IFilter génère.

La classe CFilterCF produit l’objet de fabrique de classes pour l’interface IFilter . La fabrique de classes est appelée, par le biais de son interface IClassFactory Interface, par le point d’entrée de la Fonction DllGetClassObject. La classe CFilterCF crée l’objet CFilter et retourne un pointeur vers IUnknown. Dans des cas plus complexes, un IFilter peut implémenter une hiérarchie de classes à la place de la classe CFilter unique.

Héritage des interfaces COM

Windows Search 3.0 et versions ultérieures nécessitent l’utilisation d’IPersistStream pour les raisons suivantes :

Ces interfaces sont déclarées dans les fichiers inclus dans le répertoire mssdk\include et ont des identificateurs d’interface prédéfinis (IID). Le client d’indexation de contenu interroge l’interface IFilter via IUnknown pour déterminer quelles interfaces utiliser lors du filtrage du contenu.

Implémentation des méthodes d’interface COM

L’interface IFilter implémente les méthodes IUnknown pour la classe d’interface IFilter et la fabrique de classes d’interface IFilter . Le tableau suivant répertorie, dans l’ordre vtable, les interfaces et méthodes spécifiques à l’interface IFilter que l’interface IFilter doit implémenter. L’interface IFilter doit implémenter au moins IPersistStream, mais peut implémenter des interfaces dérivées d’IPersist supplémentaires.

Interface COM Méthode
IClassFactory, interface CreateInstance, LockServer
IClassFactory2, interface GetLicInfo, RequestLicKey, CreateInstanceLic
IFilter IFilter::Init, IFilter::GetChunk, IFilter::GetText, IFilter::GetValue, IFilter::BindRegion
IPersist Interface GetClassID
Interface IPersistFile IsDirty, Load, Save, SaveCompleted, GetCurFile
Interface IPersistStorage IsDirty, Load, Save, GetSizeMax
IPersistStream Méthodes: IsDirty, Load, Save, GetSizeMax

La page de référence de chaque méthode spécifie les paramètres et le comportement fonctionnel de cette méthode. Chaque page de référence fournit également les codes de résultat à implémenter pour cette méthode. Les pages de référence des méthodes IFilter fournissent les codes de résultat spécifiques à l'interface FACILITY_ITF à implémenter, et le client d'indexation de contenu peut également gérer l'un des codes de résultat génériques, tels que FACILITY_NULL et FACILITY_WIN32. Pour plus d’informations, consultez Structure des codes d’erreur COM.

Méthodes COM qui ne sont pas implémentées

L’interface IFilter doit implémenter au moins IPersistStream, mais n’a pas besoin d’implémenter d’interfaces dérivées d’IPersist supplémentaires.

Windows Search n’a pas besoin d’implémenter les méthodes COM répertoriées dans le tableau suivant.

Méthode qui n’est pas obligatoire Descriptif
IPersistStream ::IsDirty Les filtres doivent retourner E_NOTIMPL.
IPersistStream ::Save Les filtres doivent retourner E_NOTIMPL.
IPersistStream ::GetSizeMax Les filtres doivent retourner E_NOTIMPL.
IFilter ::BindRegion Les filtres doivent retourner E_NOTIMPL.

Ressources supplémentaires

Développement de gestionnaires de filtres

Présentation des gestionnaires de filtres dans Windows Search

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

Inscription de gestionnaires de filtres

Test des gestionnaires de filtres