Guide pratique pour créer des gestionnaires d’icônes

Un type de fichier est souvent associé à une icône personnalisée pour rendre ses membres facilement reconnaissables dans Windows Explorer. Le moyen le plus simple d’affecter une icône personnalisée à un type de fichier consiste à inscrire le fichier de l’icône. Toutefois, une icône inscrite de cette manière sera la même pour tous les membres du type de fichier. Vous pouvez avoir beaucoup plus de flexibilité dans l’attribution d’icônes aux membres du type de fichier en implémentant un gestionnaire d’icônes.

Un gestionnaire d’icônes est un type de gestionnaire d’extension Shell qui vous permet d’affecter dynamiquement des icônes aux membres d’un type de fichier. Chaque fois qu’un fichier du type s’affiche, l’interpréteur de commandes interroge le gestionnaire pour obtenir l’icône appropriée. Par instance, un gestionnaire d’icônes peut affecter différentes icônes à différents membres du type de fichier ou faire varier l’icône en fonction de l’état actuel du fichier.

Les procédures générales d’implémentation et d’inscription d’un gestionnaire d’extensions Shell sont décrites dans Création de gestionnaires d’extensions Shell. Ce document se concentre sur les aspects de l’implémentation spécifiques aux gestionnaires d’icônes.

Instructions

Étape 1 : Implémentation des gestionnaires d’icônes

Comme tous les gestionnaires d’extension Shell, les gestionnaires d’icônes sont des objets COM (Component Object Model) in-process implémentés en tant que DLL. Ils doivent exporter deux interfaces en plus de IUnknown : IPersistFile et IExtractIcon.

L’interpréteur de commandes initialise le gestionnaire via son interface IPersistFile . Il utilise cette interface pour demander l’identificateur de classe (CLSID) du gestionnaire et lui fournit le nom du fichier. Le reste de l’opération s’effectue via l’interface IExtractIcon . Pour une présentation générale de l’implémentation des gestionnaires d’extensions Shell, y compris l’interface IPersistFile , consultez Création de gestionnaires d’extensions d’interpréteur de commandes. Le reste de ce document explique comment implémenter l’interface IExtractIcon .

Étape 2 : Implémentation de l’interface IExtractIcon

Une fois l’interface initialisée, l’interpréteur de commandes utilise l’interface IExtractIcon du gestionnaire pour demander l’icône appropriée. L’interface a deux méthodes : IExtractIcon::GetIconLocation et IExtractIcon::Extract.

Les icônes sont identifiées par leur emplacement dans le système de fichiers. La méthode IExtractIcon::GetIconLocation est appelée pour demander ces informations. Définissez le paramètre szIconFile sur le nom de fichier. S’il existe plusieurs icônes dans le fichier, définissez piIndex sur l’index de l’icône. Affectez les valeurs appropriées aux deux variables d’indicateur. Si vous ne souhaitez pas spécifier de nom de fichier ou si vous ne souhaitez pas que l’interpréteur de commandes extrait l’icône, définissez l’indicateur GIL_NOTFILENAME dans le paramètre pwFlags . Vous n’avez pas besoin d’affecter une valeur à szIconFile, mais le gestionnaire doit fournir des descripteurs d’icône lorsque l’interpréteur de commandes appelle IExtractIcon::Extract.

Si vous retournez un nom de fichier, l’interpréteur de commandes tente normalement de charger l’icône à partir de son cache. Pour empêcher le chargement d’une icône mise en cache, définissez l’indicateur GIL_DONTCACHE dans le paramètre pwFlags . Si aucune icône mise en cache n’est chargée, l’interpréteur de commandes appelle ensuite IExtractIcon::Extract pour demander le handle d’icône.

Si un fichier et un index ont été spécifiés par IExtractIcon::GetIconLocation, ils sont passés à IExtractIcon::Extract dans les paramètres pszFile et nIconIndex , respectivement. Si un nom de fichier est fourni, votre gestionnaire peut retourner S_FALSE pour que l’interpréteur de commandes extraye l’icône. Sinon, votre gestionnaire doit extraire ou produire des icônes grandes et petites, et affecter leurs handles HICON aux paramètres phiconLarge et phiconSmall . L’interpréteur de commandes ajoute les icônes à son cache pour accélérer les appels suivants au gestionnaire.

Étape 3 : Inscription des gestionnaires d’icônes

Lorsque vous inscrivez statiquement une icône pour un type de fichier, vous créez une sous-clé DefaultIcon sous le ProgID pour le type de fichier. Sa valeur par défaut est définie sur le fichier qui contient l’icône. Pour inscrire un gestionnaire d’icônes, vous devez toujours avoir la sous-clé DefaultIcon , mais sa valeur par défaut doit être définie sur « %1 ». Ajoutez une sous-clé IconHandler à la sous-clé Shellex de la sous-clé ProgID et définissez sa valeur par défaut sur la forme de chaîne du GUID CLSID du gestionnaire. Pour une présentation générale de l’inscription des gestionnaires d’extensions Shell, consultez Création de gestionnaires d’extensions Shell.

L’exemple suivant modifie l’entrée de Registre de Personnalisation des icônes afin que le type de fichier .myp utilise désormais un gestionnaire de menu contextuel au lieu d’une icône définie de manière statique.

HKEY_CLASSES_ROOT
   .myp
      (Default) = MyProgram.1
   MyProgram.1
      (Default) = MyProgram Application
      DefaultIcon
         (Default) = %1
      Shellex
         IconHandler
            (Default) = {The handler's CLSID GUID}

Création de gestionnaires d’extensions d’environnement

IPersistFile

IExtractIcon