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’Explorateur. La façon la 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 façon 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’extensions Shell qui vous permet d’attribuer dynamiquement des icônes aux membres d’un type de fichier. Chaque fois qu’un fichier du type est affiché, l’interpréteur de commandes interroge le gestionnaire pour l’icône appropriée. Par exemple, un gestionnaire d’icônes peut affecter différentes icônes à différents membres du type de fichier ou 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 propres aux gestionnaires d’icônes.

Instructions

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

Comme tous les gestionnaires d’extensions 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 d’IUnknown : IPersistFile et IExtractIcon.

Shell initialise le gestionnaire via son interface IPersistFile . Il utilise cette interface pour demander l’identificateur de classe du gestionnaire (CLSID) et le fournit avec le nom du fichier. Le reste de l’opération a lieu via l’interface IExtractIcon . Pour une discussion générale sur l’implémentation de gestionnaires d’extensions Shell, notamment l’interface IPersistFile , consultez Création de gestionnaires d’extensions Shell. 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 handles 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 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 transmis respectivement à IExtractIcon::Extract dans les paramètres pszFile et nIconIndex . Si un nom de fichier est fourni, votre gestionnaire peut retourner S_FALSE pour que l’interpréteur de commandes extrait l’icône. Sinon, votre gestionnaire doit extraire ou produire d’autres icônes volumineuses et petites, et affecter leurs poignées 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 de 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 discussion générale sur l’inscription des gestionnaires d’extensions Shell, consultez Création de gestionnaires d’extensions Shell.

L’exemple suivant modifie l’entrée de Registre à partir de La personnalisation des icônes afin que le type de fichier .myp utilise désormais un gestionnaire de menus contextuels au lieu d’une icône définie statiquement.

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