Installation et inscription de gestionnaires de protocole (recherche Windows)
L’installation d’un gestionnaire de protocole implique la copie des DLL vers un emplacement approprié dans le répertoire Program Files, puis l’inscription du gestionnaire de protocole via le Registre. L’application d’installation peut également ajouter une racine de recherche et des règles d’étendue pour définir une étendue d’analyse par défaut pour la source de données Shell.
Cette rubrique est organisée comme suit :
- À propos des URL
- Implémentation des interfaces de gestionnaire de protocole
- Implémentation de gestionnaires de filtres pour conteneurs
- Installation et inscription d’un gestionnaire de protocole
- S’assurer que vos éléments sont indexés
- Rubriques connexes
À propos des URL
Windows Search utilise des URL pour identifier de manière unique les éléments de la hiérarchie de votre source de données Shell. L’URL qui est le premier nœud de la hiérarchie est appelée racine de recherche. Windows Search commence l’indexation à la racine de recherche, en demandant au gestionnaire de protocole d’énumérer les liens enfants pour chaque URL.
La structure d’URL classique est la suivante :
<protocol>:// [{user SID}/] <localhost>/<path>/[<ItemID>]
La syntaxe d’URL est décrite dans le tableau suivant.
Syntaxe | Description |
---|---|
<protocol> | Identifie le gestionnaire de protocole à appeler pour l’URL. |
{SID de l’utilisateur} | Identifie le contexte de sécurité utilisateur sous lequel le gestionnaire de protocole est appelé. Si aucun identificateur de sécurité (SID) utilisateur n’est identifié, le gestionnaire de protocole est appelé dans le contexte de sécurité du service système. |
<path> | Définit la hiérarchie du magasin, où chaque barre oblique (/) est un séparateur entre les noms de dossiers. |
<ItemID> | Représente une chaîne unique qui identifie l’élément enfant (par exemple, le nom de fichier). |
L’indexeur Windows Search supprime la barre oblique finale des URL. Par conséquent, vous ne pouvez pas vous appuyer sur l’existence d’une barre oblique finale pour identifier un répertoire ou un élément. Votre gestionnaire de protocole doit être en mesure de gérer cette syntaxe d’URL. Vérifiez que le nom du protocole que vous sélectionnez pour identifier votre source de données Shell n’est pas en conflit avec les noms actuels. Nous vous recommandons cette convention d’affectation de noms : companyName.scheme
.
Pour plus d’informations sur la création d’une source de données Shell, consultez Implémentation des interfaces d’objet dossier de base.
Implémentation des interfaces de gestionnaire de protocole
La création d’un gestionnaire de protocole nécessite l’implémentation des trois interfaces suivantes :
- ISearchProtocol pour gérer les objets UrlAccessor.
- IUrlAccessor pour exposer des propriétés et identifier les filtres appropriés pour les éléments de la source de données Shell.
- IFilter pour filtrer des fichiers propriétaires ou pour énumérer et filtrer des fichiers stockés hiérarchiquement.
À part les trois interfaces obligatoires répertoriées, les autres interfaces sont facultatives et vous êtes libre d’implémenter les interfaces facultatives les plus appropriées pour la tâche à effectuer.
ISearchProtocol et ISearchProtocol2
Les interfaces SearchProtocol initialisent et gèrent les objets UrlAccessor de votre gestionnaire de protocole. L’interface ISearchProtocol2 est une extension facultative de ISearchProtocol et inclut une méthode supplémentaire pour spécifier plus d’informations sur l’utilisateur et l’élément.
IUrlAccessor, IUrlAccessor2, IUrlAccessor3 et IUrlAccessor4
Les interfaces IUrlAccessor sont décrites dans le tableau suivant.
Interface | Description |
---|---|
IUrlAccessor | Pour une URL spécifiée, l’interface IUrlAccessor permet d’accéder aux propriétés de l’élément exposé dans l’URL. Elle peut également lier ces propriétés à un filtre spécifique au gestionnaire de protocole (autrement dit, un filtre autre que celui associé au nom de fichier). |
IUrlAccessor2 (facultatif) | L’interface IUrlAccessor2 étend IUrlAccessor avec des méthodes qui obtiennent une page de codes pour les propriétés de l’élément et son URL d’affichage, et qui obtiennent le type d’élément dans l’URL (document ou répertoire). |
IUrlAccessor3 (facultatif) | L’interface IUrlAccessor3 étend IUrlAccessor2 avec une méthode qui obtient un tableau de SID utilisateurs, ce qui permet à l’hôte du protocole de recherche d’emprunter l’identité de ces utilisateurs pour indexer l’élément. |
IUrlAccessor4 (facultatif) | L’interface IUrlAccessor4 étend les fonctionnalités de l’interface IUrlAccessor3 avec une méthode qui identifie si le contenu de l’élément doit être indexé. |
L’objet UrlAccessor est instancié et initialisé par un objet SearchProtocol. Les interfaces IUrlAccessor permettent d’accéder à des informations importantes par le biais des méthodes décrites dans le tableau suivant.
Méthode | Description |
---|---|
IUrlAccessor::GetLastModified | Retourne l’heure à laquelle l’URL a été modifiée pour la dernière fois. Si cette heure est plus récente que la dernière fois que l’indexeur a traité cette URL, les gestionnaires de filtres (implémentations de l’interface IFilter) sont appelés pour extraire les données modifiées (éventuellement) pour cet élément. Les heures de modification des répertoires sont ignorées. |
IUrlAccessor::IsDirectory | Identifie si l’URL représente un dossier contenant des URL enfants. |
IUrlAccessor::BindToStream | Effectue la liaison à une interface IStream qui représente les données d’un fichier dans un magasin de données personnalisé. |
IUrlAccessor::BindToFilter | Effectue la liaison à un IFilter spécifique au gestionnaire de protocole, qui peut exposer des propriétés pour l’élément. |
IUrlAccessor4::ShouldIndexItemContent | Identifie si le contenu de l’élément doit être indexé. |
IProtocolHandlerSite
L’interface IProtocolHandlerSite est utilisée pour instancier un gestionnaire de filtres hébergé dans un processus isolé. Le gestionnaire de filtre approprié est obtenu pour un identificateur de classe persistant spécifié (CLSID), une classe de stockage de documents ou une extension de nom de fichier. L’avantage de demander au processus hôte d’effectuer la liaison à IFilter est que le processus hôte peut gérer le processus de localisation d’un gestionnaire de filtre approprié et contrôler la sécurité impliquée dans l’appel du gestionnaire.
Implémentation de gestionnaires de filtres pour conteneurs
Si vous implémentez un gestionnaire de protocole hiérarchique, vous devez alors implémenter un gestionnaire de filtres pour un conteneur qui énumère les URL enfants. Un gestionnaire de filtres est une implémentation de l’interface IFilter. Le processus d’énumération est une boucle via les méthodes IFilter::GetChunk et IFilter::GetValue de l’interface IFilter. Chaque URL enfant est exposée comme valeur de la propriété.
IFilter::GetChunk retourne les propriétés du conteneur. Pour énumérer les URL enfants, IFilter::GetChunk retourne l’une des valeurs suivantes :
-
URL de l’élément sans l’heure de dernière modification. IFilter::GetValue retourne un PROPVARIANT contenant l’URL enfant.
PKEY_Search_UrlToIndexWithModificationTime :
URL et heure de dernière modification. IFilter::GetValue retourne un PROPVARIANT contenant un vecteur de l’URL enfant et l’heure de dernière modification.
Retourner PKEY_Search_UrlToIndexWithModificationTime est plus efficace, car l’indexeur peut déterminer immédiatement si l’élément doit être indexé sans appeler les méthodes ISearchProtocol::CreateAccessor et IUrlAccessor::GetLastModified.
L’exemple de code suivant montre comment retourner la propriété PKEY_Search_UrlToIndexWithModificationTime.
Important
Copyright (c) Microsoft Corporation. Tous droits réservés.
// Parameters are assumed to be valid
HRESULT GetPropVariantForUrlAndTime
(PCWSTR pszUrl, const FILETIME &ftLastModified, PROPVARIANT **ppPropValue)
{
*ppPropValue = NULL;
// Allocate the propvariant pointer.
size_t const cbAlloc = sizeof(**ppPropValue);
*ppPropValue = (PROPVARIANT *)CoTaskMemAlloc(cbAlloc));
HRESULT hr = *ppPropValue ? S_OK : E_OUTOFMEMORY;
if (SUCCEEDED(hr))
{
PropVariantInit(*ppPropValue); // Zero init the value
// Now allocate enough memory for 2 nested PropVariants.
// PKEY_Search_UrlToIndexWithModificationTime is an array of two PROPVARIANTs.
PROPVARIANT *pVector = (PROPVARIANT *)CoTaskMemAlloc(sizeof(*pVector) * 2);
hr = pVector ? S_OK : E_OUTOFMEMORY;
if (SUCCEEDED(hr))
{
// Set the container PROPVARIANT to be a vector of two PROPVARIANTS.
(*ppPropValue)->vt = VT_VARIANT | VT_VECTOR;
(*ppPropValue)->capropvar.cElems = 2;
(*ppPropValue)->capropvar.pElems = pVector;
PWSTR pszUrlAlloc;
hr = SHStrDup(pszUrl, &pszUrlAlloc);
if (SUCCEEDED(hr))
{
// Now fill the array of PROPVARIANTS.
// Put the pointer to the URL into the vector.
(*ppPropValue)->capropvar.pElems[0].vt = VT_LPWSTR;
(*ppPropValue)->capropvar.pElems[0].pwszVal = pszUrlAlloc;
// Put the FILETIME into vector.
(*ppPropValue)->capropvar.pElems[1].vt = VT_FILETIME;
(*ppPropValue)->capropvar.pElems[1].filetime = ftLastModified;
}
else
{
CoTaskMemFree(pVector);
}
}
if (FAILED(hr))
{
CoTaskMemFree(*ppPropValue);
*ppPropValue = NULL;
}
}
return S_OK;
}
Remarque
Le composant IFilter d’un conteneur doit toujours énumérer toutes les URL enfants même si les URL enfants n’ont pas changé, car l’indexeur détecte les suppressions via le processus d’énumération. Si la sortie de date dans un PKEY_Search_UrlToIndexWithModificationTime indique que les données n’ont pas changé, l’indexeur ne met pas à jour les données de cette URL.
Installation et inscription d’un gestionnaire de protocole
L’installation de gestionnaires de protocoles implique la copie des DLL vers un emplacement approprié dans le répertoire Program Files, puis l’inscription des DLL. Les gestionnaires de protocoles doivent implémenter l’inscription automatique pour l’installation. L’application d’installation peut également ajouter une racine de recherche et des règles d’étendue pour définir une étendue d’analyse par défaut pour la source de données Shell, qui est décrite dans Vérifier que vos éléments sont indexés à la fin de cette rubrique.
Instructions pour l’inscription d’un gestionnaire de protocole
Vous devez suivre ces instructions lors de l’inscription d’un gestionnaire de protocole :
- Le programme d’installation doit utiliser le programme d’installation EXE ou MSI.
- Les notes de publication doivent être fournies.
- Une entrée Ajouter/Supprimer des programmes doit être créée pour chaque complément installé.
- Le programme d’installation doit prendre en charge tous les paramètres de Registre pour le type de fichier ou le magasin particulier que le complément actuel comprend.
- Si un complément précédent est remplacé, le programme d’installation doit avertir l’utilisateur.
- Si un complément plus récent a remplacé le complément précédent, il doit y avoir la possibilité de restaurer la fonctionnalité du complément précédent et de le rendre à nouveau le complément par défaut pour ce type de fichier.
- Le programme d’installation doit définir une étendue d’analyse par défaut pour l’indexeur en ajoutant une racine de recherche et des règles d’étendue à l’aide du Gestionnaire de l’étendue d’analyse (CSM).
Inscription d’un gestionnaire de protocole
Vous devez effectuer quatorze entrées dans le Registre pour inscrire le composant du gestionnaire de protocole, où :
- Ver_Ind_ProgID est le ProgID indépendant de la version de l’implémentation du gestionnaire de protocole.
- Ver_Dep_ProgID est le ProgID dépendant de la version de l’implémentation du gestionnaire de protocole.
- CLSID_1 est le CLSID de l’implémentation du gestionnaire de protocole.
Pour inscrire un gestionnaire de protocole :
Inscrivez le ProgID indépendant de la version avec les clés et valeurs suivantes :
HKEY_CLASSES_ROOT <Ver_Ind_ProgID> (Default) = <Protocol Handler Class Description>
HKEY_CLASSES_ROOT <Ver_Ind_ProgID> CLSID (Default) = {CLSID_1}
HKEY_CLASSES_ROOT <Ver_Ind_ProgID> CurVer (Default) = <Ver_Dep_ProgID>
Inscrivez le ProgID dépendant de la version avec les clés et valeurs suivantes :
HKEY_CLASSES_ROOT <Ver_Dep_ProgID> (Default) = <Protocol Handler Class Description>
HKEY_CLASSES_ROOT <Ver_Dep_ProgID> CLSID (Default) = {CLSID_1}
Inscrivez le CLSID du gestionnaire de protocole avec les clés et valeurs suivantes :
HKEY_CLASSES_ROOT {CLSID_1} (Default) = <Protocol Handler Class Description>
HKEY_CLASSES_ROOT {CLSID_1} {InprocServer32} (Default) = <DLL Install Path> Threading Model = Both
HKEY_CLASSES_ROOT {CLSID_1} <ProgID> (Default) = <Ver_Dep_ProgID>
HKEY_CLASSES_ROOT {CLSID_1} <ShellFolder> Attributes = dword:a0180000
HKEY_CLASSES_ROOT {CLSID_1} TypeLib (Default) = {LIBID of PH Component}
HKEY_CLASSES_ROOT {CLSID_1} VersionIndependentProgID (Default) = <Ver_Ind_ProgID>
Inscrivez le gestionnaire de protocole auprès de Windows Search. Dans l’exemple suivant, le <Nom du protocole> est le nom du protocole lui-même, tel que file, mapi, etc. :
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows Search ProtocolHandlers <Protocol Name> = <Ver_Dep_ProgID>
HKEY_CURRENT_USER SOFTWARE Microsoft Windows Search ProtocolHandlers <Protocol Name> = <Ver_Dep_ProgID>
Avant Windows Vista :
HKEY_CURRENT_USER SOFTWARE Microsoft Windows Desktop Search DS Index ProtocolHandlers <Protocol Name> HasRequirements = dword:00000000 HasStartPage = dword:00000000
Inscription du gestionnaire de types de fichiers du gestionnaire de protocole
Vous devez effectuer deux entrées dans le Registre pour inscrire le gestionnaire de types de fichiers du gestionnaire de protocole (également appelé extension d’environnement).
-
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion Explorer Desktop NameSpace {CLSID of PH Implementation} (Default) = <Shell Implementation Description>
-
HKEY_LOCAL_MACHINE SOFTWARE Microsoft Windows CurrentVersion Explorer Shell Extensions Approved {CLSID of PH Implementation} = <Shell Implementation Description>
S’assurer que vos éléments sont indexés
Une fois que vous avez implémenté votre gestionnaire de protocole, vous devez spécifier les éléments d’interpréteur de commandes que votre gestionnaire de protocole doit indexer. Vous pouvez utiliser le Gestionnaire de catalogues pour lancer la réindexation (pour plus d’informations, consultez Utilisation du Gestionnaire de catalogues). Vous pouvez également utiliser le Gestionnaire de l’étendue d’analyse (CSM) pour configurer des règles par défaut indiquant les URL que vous souhaitez que l’indexeur analyse (pour plus d’informations, voir Utilisation du Gestionnaire de l’étendue d’analyse et Utilisation du Gestionnaire de l’étendue d’analyse). Vous pouvez également ajouter une racine de recherche (pour plus d’informations, consultez Gestion des racines de recherche). Une autre option disponible est de suivre la procédure dans l’exemple ReIndex des Exemples de code Windows Search.
L’interface ISearchCrawlScopeManager fournit des méthodes qui informent le moteur de recherche des conteneurs à analyser et/ou regarder, et les éléments sous ces conteneurs à inclure ou exclure lors de l’analyse ou de l’observation. Dans Windows 7 et versions ultérieures, ISearchCrawlScopeManager2 étend ISearchCrawlScopeManager avec la méthode ISearchCrawlScopeManager2::GetVersion qui obtient la version, ce qui informe les clients si l’état du CSM a changé.
Rubriques connexes
-
Conceptuel
-
Exemple de code : extensions Shell pour les gestionnaires de protocoles
-
Création d’un connecteur de recherche pour un gestionnaire de protocole