Création de gestionnaires d’extensions d’environnement

Les fonctionnalités de l’interpréteur de commandes peuvent être étendues avec des entrées de Registre et des fichiers .ini. Bien que cette approche de l’extension de l’interpréteur de commandes soit simple et adéquate à de nombreuses fins, elle est limitée. Par exemple, si vous utilisez le Registre pour spécifier une icône personnalisée pour un type de fichier, la même icône s’affiche pour chaque fichier de ce type. L’extension de l’interpréteur de commandes avec le Registre ne vous permet pas de faire varier l’icône pour différents fichiers du même type. D’autres aspects de l’interpréteur de commandes, tels que la feuille de propriétés Propriétés qui peut être affichée lorsqu’un clic droit est fait sur un fichier, ne peuvent pas être modifiés du tout avec le Registre.

Une approche plus puissante et flexible de l’extension de l’interpréteur de commandes consiste à implémenter des gestionnaires d’extensions d’interpréteur de commandes. Ces gestionnaires peuvent être implémentés pour diverses actions que l’interpréteur de commandes peut effectuer. Avant d’effectuer l’action, l’interpréteur de commandes interroge le gestionnaire d’extensions, ce qui lui donne la possibilité de modifier l’action. Un exemple courant est un gestionnaire d’extension de menu contextuel. Si un fichier est implémenté pour un type de fichier, il est interrogé chaque fois que l’un des fichiers fait l’objet d’un clic droit. Le gestionnaire peut ensuite spécifier des éléments de menu supplémentaires fichier par fichier, plutôt que d’avoir le même jeu pour l’ensemble du type de fichier.

Ce document explique comment implémenter les gestionnaires d’extensions qui vous permettent de modifier diverses actions de l’interpréteur de commandes. Les gestionnaires suivants sont associés à un type de fichier particulier et vous permettent de spécifier fichier par fichier :

Handler Description
Gestionnaire de menu contextuel Appelé avant l’affichage du menu contextuel d’un fichier. Il vous permet d’ajouter des éléments au menu contextuel fichier par fichier.
Gestionnaire de données Appelé lorsqu’une opération de glisser-déplacer est effectuée sur des objets dragShell. Il vous permet de fournir des formats de Presse-papiers supplémentaires à la cible de dépôt.
Gestionnaire de suppression Appelé lorsqu’un objet de données est déplacé ou déposé sur un fichier. Il vous permet de transformer un fichier en cible de déplacement.
Gestionnaire d’icônes Appelé avant l’affichage de l’icône d’un fichier. Il vous permet de remplacer l’icône par défaut du fichier par une icône personnalisée fichier par fichier.
Gestionnaire de feuille de propriétés Appelée avant l’affichage de la feuille des propriétés d’un objet. Il vous permet d’ajouter ou de remplacer des pages.
Gestionnaire d’images miniatures Fournit une image pour représenter l’élément.
Gestionnaire d'info-bulle Fournit du texte contextuel lorsque l’utilisateur pointe le pointeur de la souris sur l’objet.
Gestionnaire de métadonnées Fournit un accès en lecture et en écriture aux métadonnées (propriétés) stockées dans un fichier. Vous pouvez l’utiliser pour étendre la vue Détails, les info-bulles, la page de propriétés et les fonctionnalités de regroupement.

 

D’autres gestionnaires ne sont pas associés à un type de fichier particulier, mais sont appelés avant certaines opérations de l’interpréteur de commandes :

Handler Description
Gestionnaire de colonnes Appelé par Windows Explorer avant d’afficher la vue Détails d’un dossier. Il vous permet d’ajouter des colonnes personnalisées à l’affichage Détails.
Gestionnaire de raccordement de copie Appelé lorsqu’un dossier ou un objet d’imprimante est sur le point d’être déplacé, copié, supprimé ou renommé. Il vous permet d’approuver ou d’opposer son veto à l’opération.
Gestionnaire de glisser-déplacer Appelé lorsqu’un fichier est déplacé avec le bouton droit de la souris. Il vous permet de modifier le menu contextuel qui s’affiche.
Gestionnaire de superposition d’icônes Appelé avant l’affichage de l’icône d’un fichier. Il vous permet de spécifier une superposition pour l’icône du fichier.
Gestionnaire de recherche Appelé pour lancer un moteur de recherche. Il vous permet d’implémenter un moteur de recherche personnalisé accessible à partir du menu Démarrer ou de Windows Explorer.

 

Les détails de l’implémentation de gestionnaires d’extensions spécifiques sont abordés dans les sections répertoriées ci-dessus. Le reste de ce document traite de certains problèmes d’implémentation communs à tous les gestionnaires d’extensions Shell.

Implémentation des gestionnaires d’extensions Shell

Une grande partie de l’implémentation d’un objet gestionnaire d’extension Shell dépend de son type. Il y a cependant quelques éléments communs. Cette section décrit les aspects de l’implémentation partagés par tous les gestionnaires d’extensions Shell.

De nombreux gestionnaires d’extensions Shell sont des objets COM (Component Object Model) in-process. Ils doivent se voir attribuer un GUID et les inscrire comme décrit dans Inscription des gestionnaires d’extensions shell. Elles sont implémentées en tant que DLL et doivent exporter les fonctions standard suivantes :

  • DllMain. Point d’entrée standard de la DLL.
  • DllGetClassObject. Expose la fabrique de classes de l’objet.
  • DllCanUnloadNow. COM appelle cette fonction pour déterminer si l’objet sert des clients. Si ce n’est pas le cas, le système peut décharger la DLL et libérer la mémoire associée.

Comme tous les objets COM, les gestionnaires d’extension Shell doivent implémenter une interface IUnknown et une fabrique de classes. La plupart des gestionnaires d’extensions doivent également implémenter une interface IPersistFile ou IShellExtInit dans Windows XP ou une version antérieure. Ils ont été remplacés par IInitializeWithStream, IInitializeWithItem et IInitializeWithFile dans Windows Vista. L’interpréteur de commandes utilise ces interfaces pour initialiser le gestionnaire.

L’interface IPersistFile doit être implémentée par les éléments suivants :

  • Gestionnaires de données
  • Drop handlers

Dans le passé, les gestionnaires d’icônes étaient également nécessaires pour implémenter IPersistFile, mais cela n’est plus vrai. Pour les gestionnaires d’icônes, IPersistFile est désormais facultatif et d’autres interfaces telles que IInitializeWithItem sont préférées.

L’interface IShellExtInit doit être implémentée par les éléments suivants :

  • Gestionnaires de menu contextuel
  • Gestionnaires glisser-déplacer
  • Gestionnaires de feuilles de propriétés

Implémentation d’IPersistFile

L’interface IPersistFile est destinée à permettre à un objet d’être chargé ou enregistré dans un fichier disque. Il a six méthodes en plus de IUnknown, cinq de ses propres et la méthode GetClassID qu’il hérite d’IPersist. Avec les extensions Shell, IPersist est utilisé uniquement pour initialiser un objet gestionnaire d’extensions Shell. Étant donné qu’il n’est généralement pas nécessaire de lire ou d’écrire sur le disque, seules les méthodes GetClassID et Load nécessitent une implémentation non-automatique.

L’interpréteur de commandes appelle d’abord GetClassID , et la fonction retourne l’identificateur de classe (CLSID) de l’objet gestionnaire d’extensions. L’interpréteur de commandes appelle ensuite Load et passe deux valeurs. Le premier, pszFileName, est une chaîne Unicode avec le nom du fichier ou du dossier sur lequel Shell est sur le point d’opérer. Le second est dwMode, qui indique le mode d’accès aux fichiers. Étant donné qu’il n’est généralement pas nécessaire d’accéder aux fichiers, dwMode est généralement égal à zéro. La méthode stocke ces valeurs si nécessaire pour une référence ultérieure.

Le fragment de code suivant illustre comment un gestionnaire d’extension Shell classique implémente les méthodes GetClassID et Load . Il est conçu pour gérer ANSI ou Unicode. CLSID_SampleExtHandler est le GUID de l’objet de gestionnaire d’extension, et CSampleExtHandler est le nom de la classe utilisée pour implémenter l’interface. Les variables m_szFileName et m_dwMode sont des variables privées utilisées pour stocker le nom et les indicateurs d’accès du fichier.

wchar_t m_szFileName[MAX_PATH];    // The file name
DWORD m_dwMode;                  // The file access mode

CSampleExtHandler::GetClassID(CLSID *pCLSID)
{
    *pCLSID = CLSID_SampleExtHandler;
}

CSampleExtHandler::Load(PCWSTR pszFile, DWORD dwMode)
{
    m_dwMode = dwMode;
    return StringCchCopy(_szFileName, ARRAYSIZE(m_szFileName), pszFile);
}

Implémentation d’IShellExtInit

L’interface IShellExtInit a une seule méthode, IShellExtInit::Initialize, en plus de IUnknown. La méthode a trois paramètres que l’interpréteur de commandes peut utiliser pour passer différents types d’informations. Les valeurs passées dépendent du type de gestionnaire, et certaines peuvent être définies sur NULL.

  • pIDFolder contient le pointeur d’un dossier vers une liste d’identificateurs d’élément (PIDL). Pour les extensions de feuille de propriétés, elle est NULL. Pour les extensions de menu contextuel, il s’agit du PIDL du dossier qui contient l’élément dont le menu contextuel est affiché. Pour les gestionnaires de glisser-déplacer non par défaut, il s’agit du PIDL du dossier cible.
  • pDataObject contient un pointeur vers l’interface IDataObject d’un objet de données. L’objet de données contient un ou plusieurs noms de fichiers au format CF_HDROP .
  • hRegKey contient une clé de Registre pour l’objet fichier ou le type de dossier.

La méthode IShellExtInit::Initialize stocke le nom de fichier, le pointeur IDataObject et la clé de Registre si nécessaire pour une utilisation ultérieure. Le fragment de code suivant illustre une implémentation de IShellExtInit::Initialize. Par souci de simplicité, cet exemple suppose que l’objet de données ne contient qu’un seul fichier. En général, il peut contenir plusieurs fichiers qui devront chacun être extraits.

LPCITEMIDLIST  m_pIDFolder;           //The folder's PIDL
wchar_t        m_szFile[MAX_PATH];    //The file name
IDataObject   *m_pDataObj;            //The IDataObject pointer
HKEY           m_hRegKey;             //The file or folder's registry key

STDMETHODIMP CShellExt::Initialize(LPCITEMIDLIST pIDFolder, 
                                   IDataObject *pDataObj, 
                                   HKEY hRegKey) 
{ 
    // If Initialize has already been called, release the old PIDL
    ILFree(m_pIDFolder);
    m_pIDFolder = nullptr;

    // Store the new PIDL.
    if (pIDFolder)
    {
        m_pIDFolder = ILClone(pIDFolder);
    }
    
    // If Initialize has already been called, release the old
    // IDataObject pointer.
    if (m_pDataObj)
    { 
        m_pDataObj->Release(); 
    }
     
    // If a data object pointer was passed in, save it and
    // extract the file name. 
    if (pDataObj) 
    { 
        m_pDataObj = pDataObj; 
        pDataObj->AddRef(); 
      
        STGMEDIUM   medium;
        FORMATETC   fe = {CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
        UINT        uCount;

        if (SUCCEEDED(m_pDataObj->GetData(&fe, &medium)))
        {
            // Get the count of files dropped.
            uCount = DragQueryFile((HDROP)medium.hGlobal, (UINT)-1, NULL, 0);

            // Get the first file name from the CF_HDROP.
            if (uCount)
                DragQueryFile((HDROP)medium.hGlobal, 0, m_szFile, 
                              sizeof(m_szFile)/sizeof(TCHAR));

            ReleaseStgMedium(&medium);
        }
    }

    // Duplicate the registry handle. 
    if (hRegKey) 
        RegOpenKeyEx(hRegKey, nullptr, 0L, MAXIMUM_ALLOWED, &m_hRegKey); 
    return S_OK; 
}

CSampleExtHandler est le nom de la classe utilisée pour implémenter l’interface. Les variables m_pIDFolder, m_pDataObject, m_szFileName et m_hRegKey sont des variables privées utilisées pour stocker les informations transmises. Par souci de simplicité, cet exemple suppose qu’un seul nom de fichier sera conservé par l’objet de données. Une fois la structure FORMATETC récupérée à partir de l’objet de données, DragQueryFile est utilisé pour extraire le nom de fichier du membre medium.hGlobal de la structure FORMATETC. Si une clé de Registre est passée, la méthode utilise RegOpenKeyEx pour ouvrir la clé et affecte le handle à m_hRegKey.

Personnalisation de l’info-bulle

Il existe deux façons de personnaliser les info-bulles :

  • Implémentez un objet qui prend en charge IQueryInfo , puis inscrivez cet objet sous la sous-clé appropriée dans le Registre (voir Inscription des gestionnaires d’extension shell ci-dessous).
  • Spécifiez une chaîne fixe ou une liste de propriétés de fichier spécifiques à afficher.

Pour afficher une chaîne fixe pour une extension d’espace de noms, créez une entrée appelée InfoTip dans la clé {CLSID} de votre extension d’espace de noms. Définissez la valeur de cette entrée sur la chaîne littérale que vous souhaitez afficher, comme illustré dans cet exemple, ou sur une chaîne indirecte qui spécifie une ressource et un index dans cette ressource (à des fins de localisation).

HKEY_CLASSES_ROOT
   CLSID
      {CLSID}
         InfoTip = InfoTip string for your namespace extension

Pour afficher une chaîne fixe pour un type de fichier, créez une entrée appelée InfoTip dans la clé ProgID de ce type de fichier. Définissez la valeur de cette entrée sur la chaîne littérale que vous souhaitez afficher ou une chaîne indirecte qui spécifie une ressource et un index dans cette ressource (à des fins de localisation), comme illustré dans cet exemple.

HKEY_CLASSES_ROOT
   ProgID
      InfoTip = Resource.dll, 3

Si vous souhaitez que l’interpréteur de commandes affiche des propriétés de fichier spécifiques dans l’info-bulle pour un type de fichier spécifique, créez une entrée appelée InfoTip dans la clé ProgID pour ce type de fichier. Définissez la valeur de cette entrée sur une liste délimitée par des points-virgules de noms de propriétés canoniques, de paires d’identificateur de format (FMTID)/identificateur de propriété (PID), ou les deux. Cette valeur doit commencer par « prop: » pour l’identifier en tant que chaîne de liste de propriétés. Si vous omettez « prop: », la valeur est considérée comme une chaîne littérale et affichée en tant que telle.

Dans l’exemple suivant, propname est un nom de propriété canonique (par exemple, System.Date) et {fmtid},pid est une paire FMTID/PID .

HKEY_CLASSES_ROOT
   ProgID
      InfoTip = prop:propname;propname;{fmtid},pid;{fmtid},pid

Les noms de propriétés suivants peuvent être utilisés :

Nom de la propriété Description Récupéré à partir de
Auteur Auteur du document PIDSI_AUTHOR
Titre Titre du document PIDSI_TITLE
Objet Résumé de l’objet PIDSI_SUBJECT
Commentaire Commentaires de document PIDSI_COMMENT ou propriétés de dossier/pilote
PageCount Nombre de pages PIDSI_PAGECOUNT
Nom Nom convivial Affichage des dossiers standard
OriginalLocation Emplacement du fichier d’origine Dossier porte-documents et dossier Corbeille
DateDeleted Date de suppression du fichier Dossier Corbeille
Type Type de fichier Vue des détails du dossier standard
Taille Taille du fichier Vue des détails du dossier standard
SyncCopyIn Identique à OriginalLocation Identique à OriginalLocation
Modifié le Date de dernière modification Vue des détails du dossier standard
Date de création Date de création Vue des détails du dossier standard
Consulté Date du dernier accès Vue des détails du dossier standard
InFolder Répertoire contenant le fichier Résultats de la recherche de documents
Rank Qualité de la correspondance de recherche Résultats de la recherche de documents
FreeSpace Espace de stockage disponible Lecteurs de disque
NumberOfVisits Nombre de visites Dossier Favoris
Attributs Attributs de fichier Vue des détails du dossier standard
Company Nom de la société PIDDSI_COMPANY
Category Catégorie de document PIDDSI_CATEGORY
copyright Droits d’auteur multimédias PIDMSI_COPYRIGHT
HTMLInfoTipFile Fichier info-bulle HTML fichier Desktop.ini pour le dossier

 

Amélioration de La recherche Windows avec des gestionnaires d’extension Shell

Les gestionnaires d’extensions shell peuvent être utilisés pour améliorer l’expérience utilisateur fournie par un gestionnaire de protocole Windows Search. Pour permettre de telles améliorations, le gestionnaire d’extension Shell de prise en charge doit être conçu pour s’intégrer au gestionnaire de protocole de recherche en tant que source de données. Pour plus d’informations sur l’amélioration d’un gestionnaire de protocole Recherche Windows via l’intégration à un gestionnaire d’extension Shell, consultez Ajout d’icônes, d’aperçus et de menus contextuels. Pour plus d’informations sur les gestionnaires de protocole De recherche Windows, consultez Développement de gestionnaires de protocole.

Enregistrement de gestionnaires d’extensions d’environnement

Un objet gestionnaire d’extension Shell doit être inscrit avant que l’interpréteur de commandes puisse l’utiliser. Cette section est une présentation générale de l’inscription d’un gestionnaire d’extensions Shell.

Chaque fois que vous créez ou modifiez un gestionnaire d’extensions Shell, il est important d’informer le système que vous avez apporté une modification avec SHChangeNotify, en spécifiant l’événement SHCNE_ASSOCCHANGED . Si vous n’appelez pas SHChangeNotify, la modification peut ne pas être reconnue tant que le système n’est pas redémarré.

Comme pour tous les objets COM, vous devez créer un GUID pour le gestionnaire à l’aide d’un outil tel que UUIDGEN.exe. Créez une clé sous HKEY_CLASSES_ROOT\CLSID dont le nom est la forme de chaîne du GUID. Étant donné que les gestionnaires d’extensions Shell sont des serveurs in-process, vous devez créer une clé InProcServer32 sous la clé GUID avec la valeur par défaut définie sur le chemin d’accès de la DLL du gestionnaire. Utilisez le modèle de thread d’appartement.

Chaque fois que l’interpréteur de commandes prend une action qui peut impliquer un gestionnaire d’extension Shell, il vérifie la clé de Registre appropriée. La clé sous laquelle un gestionnaire d’extension est inscrit contrôle donc quand il sera appelé. Par instance, il est courant d’avoir un gestionnaire de menus contextuels appelé lorsque l’interpréteur de commandes affiche un menu contextuel pour un membre d’un type de fichier. Dans ce cas, le gestionnaire doit être inscrit sous la clé ProgID du type de fichier.

Noms des gestionnaires

Pour activer un gestionnaire d’extension Shell, créez une sous-clé avec le nom de sous-clé du gestionnaire (voir ci-dessous) sous la sous-clé ShellEx du ProgID (pour les types de fichiers) ou le nom du type d’objet Shell (pour les objets Shell prédéfinis).

Par exemple, si vous souhaitez inscrire un gestionnaire d’extension de menu contextuel pour MyProgram.1, vous devez commencer par créer la sous-clé suivante :

HKEY_CLASSES_ROOT
   MyProgram.1
      ShellEx
         ContextMenuHandlers

Pour les gestionnaires suivants, créez une sous-clé sous la clé « Handler Subkey name » dont le nom est la version de chaîne du CLSID de l’extension Shell. Plusieurs extensions peuvent être inscrites sous la clé de nom de sous-clé du gestionnaire en créant plusieurs sous-clés.

Handler Interface Nom de la sous-clé du gestionnaire
Gestionnaire de menus contextuels IContextMenu ContextMenuHandlers
Gestionnaire de copyhook ICopyHook CopyHookHandlers
Gestionnaire de glisser-déplacer IContextMenu DragDropHandlers
Gestionnaire de feuille de propriétés IShellPropSheetExt PropertySheetHandlers
Gestionnaire de fournisseur de colonnes (déconseillé dans Windows Vista) IColumnProvider ColumnHandlers

 

Pour les gestionnaires suivants, la valeur par défaut de la clé « Handler Subkey Name » est la version sous-chaîne du CLSID de l’extension Shell. Une seule extension peut être inscrite pour ces gestionnaires.

Handler Interface Nom de la sous-clé du gestionnaire
Gestionnaire de données Idataobject Gestionnaire de données
Gestionnaire de suppression IDropTarget DropHandler
Gestionnaire d’icônes IExtractIconA/W IconHandler
Gestionnaire d’images IExtractImage {BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}
Gestionnaire d’images miniatures IThumbnailProvider {E357FCCD-A995-4576-B01F-234630154E96}
Gestionnaire d'info-bulle IQueryInfo {00021500-0000-0000-C000-000000000046}
Lien shell (ANSI ) IShellLinkA {000214EE-0000-0000-C000-0000000000046}
Lien de l’interpréteur de commandes (UNICODE) IShellLinkW {000214F9-0000-0000-C000-0000000000046}
Stockage structuré IStorage {00000000B-0000-0000-C000-000000000046}
Métadonnées Ipropertystore Gestionnaire de propriétés
Métadonnées IPropertySetStorage (déconseillé dans Windows Vista) Gestionnaire de propriétés
Épingler au menu Démarrer IStartMenuPinnedList {a2a9545d-a0c2-42b4-9708-a0b2badd77c8}
Épingler à la barre des tâches {90AA3A4E-1CBA-4233-B8BB-535773D48449}

 

Les sous-clés spécifiées pour ajouter Épingler au menu Démarrer et Épingler à la barre des tâches au menu contextuel d’un élément sont requises uniquement pour les types de fichiers qui incluent l’entrée IsShortCut .

La prise en charge des gestionnaires de fournisseurs de colonnes a été supprimée dans Windows Vista. En outre, depuis Windows Vista, IPropertySetStorage est déprécié en faveur de IPropertyStore.

Bien que IExtractImage reste pris en charge, IThumbnailProvider est préféré pour Windows Vista et versions ultérieures.

Objets shell prédéfinis

L’interpréteur de commandes définit des objets supplémentaires sous HKEY_CLASSES_ROOT qui peuvent être étendus de la même façon que les types de fichiers. Par exemple, pour ajouter un gestionnaire de feuilles de propriétés pour tous les fichiers, vous pouvez vous inscrire sous la clé PropertySheetHandlers .

HKEY_CLASSES_ROOT
   *
      shellex
         PropertySheetHandlers

Le tableau suivant indique les différentes sous-clés de HKEY_CLASSES_ROOT sous lesquelles les gestionnaires d’extensions peuvent être inscrits. Notez que de nombreux gestionnaires d’extensions ne peuvent pas être inscrits sous toutes les sous-clés répertoriées. Pour plus d’informations, consultez la documentation du gestionnaire spécifique.

Sous-clé Description Gestionnaires possibles Version
* Tous les fichiers Menu contextuel, Feuille de propriétés, Verbes (voir ci-dessous) Tous
AllFileSystemObjects Tous les fichiers et dossiers de fichiers Menu contextuel, Feuille de propriétés, Verbes 4.71
Folder Tous les dossiers Menu contextuel, Feuille de propriétés, Verbes Tous
Directory Dossiers de fichiers Menu contextuel, Feuille de propriétés, Verbes Tous
Répertoire\Arrière-plan Arrière-plan du dossier de fichiers Menu contextuel uniquement 4.71
Disque Tous les lecteurs dans MyComputer, tels que « C:\ » Menu contextuel, Feuille de propriétés, Verbes Tous
Réseau Tout le réseau (sous Mes emplacements réseau) Menu contextuel, Feuille de propriétés, Verbes Tous
Network\Type\ # Tous les objets de type # (voir ci-dessous) Menu contextuel, Feuille de propriétés, Verbes 4.71
Netshare Tous les partages réseau Menu contextuel, Feuille de propriétés, Verbes 4.71
NetServer Tous les serveurs réseau Menu contextuel, Feuille de propriétés, Verbes 4.71
network_provider_name Tous les objets fournis par le fournisseur de réseau « network_provider_name » Menu contextuel, Feuille de propriétés, Verbes Tous
Imprimantes Toutes les imprimantes Menu contextuel, Feuille de propriétés Tous
Audiocd CD audio dans le lecteur de CD Verbes uniquement Tous
DVD Lecteur DE DVD (Windows 2000) Menu contextuel, Feuille de propriétés, Verbes 4.71

 

Remarques :

  • Le menu contextuel d’arrière-plan du dossier de fichiers est accessible en cliquant avec le bouton droit dans un dossier de fichiers, mais pas sur le contenu du dossier.
  • Les « verbes » sont des commandes spéciales inscrites sous HKEY_CLASSES_ROOT\verbede l’interpréteur\de sous-clés\ .
  • Pour Type de réseau\\#, « # » est un code de type de fournisseur réseau en décimal. Le code de type de fournisseur de réseau est le mot haut d’un type de réseau. La liste des types de réseau est donnée dans le fichier d’en-tête Winnetwk.h (valeurs WNNC_NET_*). Par exemple, WNNC_NET_SHIVA est 0x00330000, de sorte que la clé de type correspondante serait HKEY_CLASSES_ROOT\type\réseau\51 .
  • « network_provider_name » est un nom de fournisseur de réseau tel que spécifié par WNetGetProviderName, avec les espaces convertis en traits de soulignement. Par exemple, si le fournisseur réseau Microsoft Networking est installé, son nom de fournisseur est « Microsoft Windows Network » et le network_provider_name correspondant est Microsoft_Windows_Network.

Exemple d’inscription de gestionnaire d’extensions

Pour activer un gestionnaire particulier, créez une sous-clé sous la clé de type du gestionnaire d’extension avec le nom du gestionnaire. L’interpréteur de commandes n’utilise pas le nom du gestionnaire, mais il doit être différent de tous les autres noms sous cette sous-clé de type. Définissez la valeur par défaut de la sous-clé name sur la forme de chaîne du GUID du gestionnaire.

L’exemple suivant illustre les entrées de Registre qui activent les gestionnaires de menu contextuel et d’extension de feuille de propriétés, à l’aide d’un exemple de type de fichier .myp :

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
   CLSID
      {00000000-1111-2222-3333-444444444444}
         InProcServer32
            (Default) = C:\MyDir\MyCommand.dll
            ThreadingModel = Apartment
      {11111111-2222-3333-4444-555555555555}
         InProcServer32
            (Default) = C:\MyDir\MyPropSheet.dll
            ThreadingModel = Apartment
   MyProgram.1
      (Default) = MyProgram Application
      Shellex
         ContextMenuHandler
            MyCommand
               (Default) = {00000000-1111-2222-3333-444444444444}
         PropertySheetHandlers
            MyPropSheet
               (Default) = {11111111-2222-3333-4444-555555555555}

La procédure d’inscription décrite dans cette section doit être suivie pour tous les systèmes Windows.

Conseils pour l’implémentation d’extensions In-Process