Cómo crear controladores de iconos

Un tipo de archivo suele tener un icono personalizado asociado para que sus miembros sean fácilmente reconocibles en el Explorador de Windows. La manera más sencilla de asignar un icono personalizado a un tipo de archivo es registrar el archivo del icono. Sin embargo, un icono registrado de esta manera será el mismo para todos los miembros del tipo de archivo. Puede tener mucha más flexibilidad para asignar iconos a los miembros del tipo de archivo mediante la implementación de un controlador de iconos.

Un controlador de iconos es un tipo de controlador de extensión de Shell que permite asignar iconos dinámicamente a los miembros de un tipo de archivo. Cada vez que se muestra un archivo del tipo, shell consulta al controlador para el icono adecuado. Por ejemplo, un controlador de iconos puede asignar iconos diferentes a distintos miembros del tipo de archivo o variar el icono en función del estado actual del archivo.

Los procedimientos generales para implementar y registrar un controlador de extensión de Shell se describen en Creación de controladores de extensión de Shell. Este documento se centra en los aspectos de la implementación específicos de los controladores de iconos.

Instrucciones

Paso 1: Implementar controladores de iconos

Al igual que todos los controladores de extensión de Shell, los controladores de iconos son objetos del modelo de objetos componentes (COM) en proceso implementados como archivos DLL. Deben exportar dos interfaces además de IUnknown: IPersistFile e IExtractIcon.

Shell inicializa el controlador a través de su interfaz IPersistFile . Usa esta interfaz para solicitar el identificador de clase (CLSID) del controlador y le proporciona el nombre del archivo. El resto de la operación se realiza a través de la interfaz IExtractIcon . Para obtener una explicación general sobre cómo implementar controladores de extensión de Shell, incluida la interfaz IPersistFile , consulte Creación de controladores de extensión de Shell. En el resto de este documento se describe cómo implementar la interfaz IExtractIcon .

Paso 2: Implementar la interfaz IExtractIcon

Una vez inicializada la interfaz, shell usa la interfaz IExtractIcon del controlador para solicitar el icono adecuado. La interfaz tiene dos métodos: IExtractIcon::GetIconLocation e IExtractIcon::Extract.

Los iconos se identifican por su ubicación en el sistema de archivos. Se llama al método IExtractIcon::GetIconLocation para solicitar esta información. Establezca el parámetro szIconFile en el nombre de archivo. Si hay más de un icono en el archivo, establezca piIndex en el índice del icono. Asigne los valores adecuados a las dos variables de marca. Si no desea especificar un nombre de archivo o si no desea que shell extraiga el icono, establezca la marca GIL_NOTFILENAME en el parámetro pwFlags . No es necesario asignar un valor a szIconFile, pero el controlador debe proporcionar identificadores de icono cuando shell llama a IExtractIcon::Extract.

Si devuelve un nombre de archivo, el Shell normalmente intenta cargar el icono desde su memoria caché. Para evitar la carga de un icono almacenado en caché, establezca la marca GIL_DONTCACHE en el parámetro pwFlags . Si no se carga un icono almacenado en caché, shell llama a IExtractIcon::Extract para solicitar el identificador de icono.

Si IExtractIcon::GetIconLocation especifica un archivo y un índice, se pasan a IExtractIcon::Extract en los parámetros pszFile y nIconIndex , respectivamente. Si se proporciona un nombre de archivo, el controlador puede devolver S_FALSE para que shell extraiga el icono. De lo contrario, el controlador debe extraer o producir iconos grandes y pequeños, y asignar sus identificadores HICON a los parámetros phiconLarge y phiconSmall . Shell agrega los iconos a su memoria caché para acelerar las llamadas posteriores al controlador.

Paso 3: Registrar controladores de iconos

Al registrar estáticamente un icono para un tipo de archivo, se crea una subclave DefaultIcon en progID para el tipo de archivo. Su valor predeterminado se establece en el archivo que contiene el icono. Para registrar un controlador de iconos, debe tener la subclave DefaultIcon , pero su valor predeterminado debe establecerse en "%1". Agregue una subclave IconHandler a la subclave Shellex de la subclave ProgID y establezca su valor predeterminado en la forma de cadena del GUID CLSID del controlador. Para obtener una explicación general sobre cómo registrar controladores de extensión de Shell, consulte Creación de controladores de extensión de Shell.

En el ejemplo siguiente se modifica la entrada del Registro de Personalización de iconos para que el tipo de archivo .myp use ahora un controlador de menú contextual en lugar de un icono definido estáticamente.

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

Creación de controladores de extensiones de shell

IPersistFile

IExtractIcon