Création de gestionnaires d’extensions d’environnement

Les fonctionnalités de l’interpréteur de commandes peuvent être étendues avec les entrées de Registre et les 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 modifier 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 peuvent être affichés lorsqu’un fichier est cliqué avec le bouton droit, ne peuvent pas être modifiés du tout avec le Registre.

Une approche plus puissante et plus flexible pour étendre l’interpréteur de commandes consiste à implémenter des gestionnaires d’extensions shell. Ces gestionnaires peuvent être implémentés pour diverses actions que l’interpréteur de commandes peut effectuer. Avant d’entreprendre 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’extensions de menu contextuel. Si l’un d’eux est implémenté pour un type de fichier, il sera interrogé chaque fois qu’un des fichiers est cliqué avec le bouton droit. Le gestionnaire peut ensuite spécifier des éléments de menu supplémentaires sur une base de fichier par fichier, plutôt que d’avoir le même ensemble pour l’ensemble du type de fichier.

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

Handler Description
Gestionnaire de menus contextuels Appelé avant l’affichage du menu contextuel d’un fichier. Il vous permet d’ajouter des éléments au menu contextuel sur une base de fichiers par fichier.
Gestionnaire de données Appelé lorsqu’une opération glisser-déplacer est effectuée sur les 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 supprimé sur un fichier. Il vous permet de transformer un fichier en cible déroulante.
Gestionnaire d’icônes Appelée 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 sur une base de fichier par fichier.
Gestionnaire de feuille de propriétés Appelée avant l’affichage de la feuille de 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 place 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 l’affichage 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 Shell :

Handler Description
Gestionnaire de colonnes Appelé par Windows Explorer avant d’afficher l’affichage Détails d’un dossier. Il vous permet d’ajouter des colonnes personnalisées à l’affichage Détails.
Copier hook gestionnaire 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 de bloquer 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ée 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 l’Explorateur Windows.

 

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 couvre certains problèmes d’implémentation communs à tous les gestionnaires d’extensions Shell.

Implémentation de gestionnaires d’extensions Shell

La majeure partie de l’implémentation d’un objet gestionnaire d’extensions Shell dépend de son type. Toutefois, certains éléments communs sont présents. 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 être affectés à un GUID et inscrits comme décrit dans l’inscription de gestionnaires d’extensions Shell. Ils sont implémentés en tant que DLL et doivent exporter les fonctions standard suivantes :

  • DllMain. Point d’entrée standard vers la DLL.
  • DllGetClassObject. Expose la fabrique de classe 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’extensions 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. Celles-ci ont été remplacées 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
  • Gestionnaires de suppression

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 menus contextuels
  • Gestionnaires glisser-déplacer
  • Gestionnaires de feuille de propriétés

Implémentation d’IPersistFile

L’interface IPersistFile est destinée à permettre le chargement ou l’enregistrement d’un objet dans un fichier disque. Il a six méthodes en plus de IUnknown, cinq de ses propres, et la méthode GetClassID qu’elle 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 nonken.

L’interpréteur de commandes appelle d’abord GetClassID et la fonction retourne l’identificateur de classe (CLSID) de l’objet de gestionnaire d’extension. L’interpréteur de commandes appelle ensuite Load et passe deux valeurs. Le premier, pszFileName, est une chaîne Unicode portant le nom du fichier ou du dossier sur lequel Shell est sur le point de fonctionner. La seconde 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 référence ultérieure.

Le fragment de code suivant illustre comment un gestionnaire d’extensions Shell standard 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 n’a qu’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, il s’agit de NULL. Pour les extensions de menu contextuel, il s’agit du fichier PIDL du dossier qui contient l’élément dont le menu contextuel est affiché. Pour les gestionnaires de glisser-déplacer non définis, 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 le type d’objet ou de dossier de fichier.

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 d’IShellExtInit::Initialize. Par souci de simplicité, cet exemple part du principe que l’objet de données ne contient qu’un seul fichier. En général, il peut contenir plusieurs fichiers qui doivent ê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 assigne 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 Registering Shell Extension Handlers 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 indiqué dans cet exemple, ou 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 comme 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 d’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 pour qu’elle soit une liste délimitée par des points-virgules de noms de propriétés canoniques, des 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 comme 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
Comment 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 en minuscules et dossier Corbeille
DateDeleted Le fichier de date a été supprimé Dossier Corbeille
Type Type de fichier Affichage des détails du dossier standard
Taille Taille du fichier Affichage des détails du dossier standard
SyncCopyIn Identique à OriginalLocation Identique à OriginalLocation
Modifié le Date de dernière modification Affichage des détails du dossier standard
Date de création Date de création Affichage des détails du dossier standard
Consulté Date du dernier accès Affichage 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 Affichage des détails du dossier standard
Company Nom de la société PIDDSI_COMPANY
Category Catégorie de document PIDDSI_CATEGORY
copyright Copyright des médias PIDMSI_COPYRIGHT
HTMLInfoTipFile Fichier Info-bulle HTML fichier Desktop.ini pour le dossier

 

Amélioration de la recherche Windows avec des gestionnaires d’extensions Shell

Les gestionnaires d’extensions Shell peuvent être utilisés pour améliorer l’expérience utilisateur fournie par un gestionnaire de protocole de recherche Windows. Pour permettre ces améliorations, le gestionnaire d’extensions 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 de recherche Windows via l’intégration à un gestionnaire d’extensions Shell, consultez Ajout d’icônes, d’aperçus et de menus contextuels. Pour plus d’informations sur Windows gestionnaires de protocole de recherche, consultez Développement de gestionnaires de protocole.

Inscription de gestionnaires d’extensions Shell

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

Chaque fois que vous créez ou modifiez un gestionnaire d’extensions Shell, il est important de notifier 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 avec 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 de la DLL du gestionnaire. Utilisez le modèle de threading d’appartement.

Chaque fois que l’interpréteur de commandes effectue une action qui peut impliquer un gestionnaire d’extensions 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 exemple, 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 de gestionnaires

Pour activer un gestionnaire d’extensions Shell, créez une sous-clé avec le nom de sous-clé du gestionnaire (voir ci-dessous) sous la sous-clé ShellEx de 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é « Nom de sous-clé de gestionnaire » 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 copyhook ICopyHook CopyHookHandlers
Gestionnaire de glisser-déplacer IContextMenu DragDropHandlers
Gestionnaire de feuille de propriétés IShellPropSheetExt PropertySheetHandlers
Gestionnaire de fournisseurs 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 de 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-000000000046}
Lien Shell (UNICODE) IShellLinkW {000214F9-0000-0000-C000-000000000046}
Stockage structuré IStorage {0000000B-0000-0000-C000-000000000046}
Métadonnées Ipropertystore PropertyHandler
Métadonnées IPropertySetStorage (déconseillé dans Windows Vista) PropertyHandler
É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 un code confidentiel au menu Démarrer et épingler à la barre des tâches dans le menu contextuel d’un élément sont uniquement requises 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 a été déconseillé 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 feuille de propriétés pour tous les fichiers, vous pouvez vous inscrire sous la clé PropertySheetHandlers .

HKEY_CLASSES_ROOT
   *
      shellex
         PropertySheetHandlers

Le tableau suivant fournit 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 fichier Menu contextuel uniquement 4.71
Lecteur Tous les lecteurs dans MyComputer, tels que « C:\ » Menu contextuel, Feuille de propriétés, Verbes Tous
Réseau Réseau entier (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 un lecteur CD Verbes uniquement Tous
DVD Lecteur DVD (Windows 2000) Menu contextuel, Feuille de propriétés, Verbes 4.71

 

Remarques :

  • Le menu contextuel du dossier de fichier est accessible en cliquant avec le bouton droit dans un dossier de fichier, mais pas sur le contenu du dossier.
  • Les « verbes » sont des commandes spéciales inscrites sous HKEY_CLASSES_ROOT\SubkeyShellVerb\\ .
  • Pour NetworkType\\#, « # » est un code de type de fournisseur de réseau en décimal. Le code de type de fournisseur de réseau est le mot élevé d’un type 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. La clé de type correspondante est donc HKEY_CLASSES_ROOT\NetworkType51\\ .
  • « 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 d’un 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é de nom sur la forme de chaîne du GUID du gestionnaire.

L’exemple suivant illustre les entrées de Registre qui activent le menu contextuel et les gestionnaires d’extensions 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