Compartir a través de


Registro de controladores de extensiones de shell

Se debe registrar un objeto de controlador de extensión de Shell antes de que el Shell pueda usarlo. Este tema es una explicación general de cómo registrar un controlador de extensión de Shell.

Cada vez que cree o cambie un controlador de extensión de Shell, es importante notificar al sistema que ha realizado un cambio. Para ello, llame a SHChangeNotify y especifique el evento SHCNE_ASSOCCHANGED . Si no llama a SHChangeNotify, es posible que el cambio no se reconozca hasta que se reinicie el sistema.

Hay algunos factores adicionales que se aplican a los sistemas Windows 2000. Para obtener más información, consulta la sección Registrar controladores de extensiones de shell en sistemas Windows 2000 .

Al igual que con todos los objetos del Modelo de objetos componentes (COM), debe crear un GUID para el controlador mediante una herramienta como Guidgen.exe, que se proporciona con el Kit de desarrollo de software (SDK) de Windows. Cree una subclave en HKEY_CLASSES_ROOT\CLSID cuyo nombre sea la forma de cadena de ese GUID. Dado que los controladores de extensión de Shell son servidores en proceso, también debe crear una subclave InprocServer32 en esa subclave GUID con el valor (predeterminado) establecido en la ruta de acceso del archivo DLL del controlador. Use el modelo de subprocesos de apartamento. A continuación, se muestra un ejemplo:

HKEY_CLASSES_ROOT
   CLSID
      {00021500-0000-0000-C000-000000000046}
         InprocServer32
            (Default) = %windir%\System32\Example.dll
            ThreadingModel = Apartment

Cada vez que el Shell realiza una acción que puede implicar un controlador de extensión de Shell, comprueba la subclave del Registro adecuada. La subclave en la que se registra un controlador de extensión controla cuándo se llamará. Por ejemplo, es una práctica habitual tener un controlador de menú contextual al que se llama cuando shell muestra un menú contextual para un miembro de un tipo de archivo. En este caso, el controlador debe estar registrado en la subclave ProgID del tipo de archivo.

En este tema se describen los temas siguientes:

Nombres de controlador

Para habilitar un controlador de extensión de Shell, cree una subclave con el nombre de la subclave del controlador (vea a continuación) en la subclave ShellEx de ProgID (para tipos de archivo) o el nombre del tipo de objeto shell (para predefined_shell_objects).

Por ejemplo, si desea registrar un controlador de extensión de menú contextual para MyProgram.1, empiece por crear la siguiente subclave:

HKEY_CLASSES_ROOT
   MyProgram.1
      ShellEx
         ContextMenuHandlers

Para los siguientes controladores, cree una subclave debajo de la subclave "Nombre de subclave del controlador" denominada como la versión de cadena del identificador de clase (CLSID) de la extensión shell. Se pueden registrar varias extensiones en el nombre de la subclave del controlador mediante la creación de varias subclaves.

Controlador Interfaz Nombre de subclave del controlador
Controlador de proveedor de columnas IColumnProvider ColumnHandlers
Controlador de menú contextual IContextMenu ContextMenuHandlers
Controlador de copyhook ICopyHook CopyHookHandlers
Controlador de arrastrar y colocar IContextMenu DragDropHandlers
Controlador de la hoja de propiedades IShellPropSheetExt PropertySheetHandlers

 

Para los siguientes controladores, el valor predeterminado de la clave "Nombre de subclave del controlador" es la versión de cadena del CLSID de la extensión shell. Solo se puede registrar una extensión para estos controladores.

Controlador Interfaz Nombre de subclave del controlador
Controlador de datos IDataObject Datahandler
Controlador de colocación IDropTarget DropHandler
Controlador de iconos IExtractIconA/W IconHandler
Controlador de imágenes en miniatura IThumbnailProvider {E357FCCD-A995-4576-B01F-234630154E96}
Controlador de recuadro informativo IQueryInfo {00021500-0000-0000-C000-000000000046}
Vínculo de Shell (ANSI) IShellLinkA {000214EE-0000-0000-C000-000000000046}
Vínculo de Shell (UNICODE) IShellLinkW {000214F9-0000-0000-C000-000000000046}
Almacenamiento estructurado IStorage {0000000B-0000-0000-C000-0000000000046}
Metadatos IPropertySetStorage PropertyHandler
Anclar al menú Inicio IStartMenuPinnedList {a2a9545d-a0c2-42b4-9708-a0b2badd77c8}
Anclar a la barra de tareas {90AA3A4E-1CBA-4233-B8BB-535773D48449}

 

Las subclaves especificadas para agregar Anclar al menú Inicio y Anclar a la barra de tareas al menú contextual de un elemento solo son necesarias para los tipos de archivo que incluyen la entrada IsShortCut .

Objetos de Shell predefinidos

El Shell define objetos adicionales en HKEY_CLASSES_ROOT que se pueden extender de la misma manera que los tipos de archivo. Por ejemplo, para agregar un controlador de hoja de propiedades para todos los archivos, puede registrarse en la subclave PropertySheetHandlers .

HKEY_CLASSES_ROOT
   *
      shellex
         PropertySheetHandlers

En la tabla siguiente se proporcionan las distintas subclaves de HKEY_CLASSES_ROOT en las que se pueden registrar controladores de extensión. Tenga en cuenta que muchos controladores de extensión no se pueden registrar en todas las subclaves enumeradas. Para obtener más información, consulte la documentación del controlador específico.

Subclave Descripción Posibles controladores
* Todos los archivos Menú contextual, Hoja de propiedades, Verbos (ver a continuación)
AllFileSystemObjects Todos los archivos y carpetas de archivos Menú contextual, hoja de propiedades, verbos
Carpeta Todas las carpetas Menú contextual, hoja de propiedades, verbos
Directorio Carpetas de archivos Menú contextual, hoja de propiedades, verbos
Directory\Background Fondo de la carpeta de archivos Solo menú contextual
DesktopBackground Fondo de escritorio (Windows 7 y versiones posteriores) Menú contextual, Verbos
Conducir Todas las unidades de MyComputer, como "C:\" Menú contextual, hoja de propiedades, verbos
Network Toda la red (en Mis lugares de red) Menú contextual, hoja de propiedades, verbos
Network\Type\ # Todos los objetos de tipo # (consulte a continuación) Menú contextual, hoja de propiedades, verbos
NetShare Todos los recursos compartidos de red Menú contextual, hoja de propiedades, verbos
Netserver Todos los servidores de red Menú contextual, hoja de propiedades, verbos
network_provider_name Todos los objetos proporcionados por el proveedor de red "network_provider_name" Menú contextual, hoja de propiedades, verbos
Impresoras Todas las impresoras Menú contextual, hoja de propiedades
AudioCD Cd de audio en la unidad de CD Solo verbos
DVD Unidad de DVD (Windows 2000) Menú contextual, hoja de propiedades, verbos

 

Notas

  • Para acceder al menú contextual de fondo de la carpeta de archivos, haga clic con el botón derecho en una carpeta de archivos, pero no sobre ninguno de los contenidos de la carpeta.
  • "Verbos" son comandos especiales registrados en HKEY_CLASSES_ROOT\Verbo delshell\de subclave\.
  • EnTipo\#de red\, "#" es un código de tipo de proveedor de red en decimal. El código de tipo de proveedor de red es la palabra alta de un tipo de red. La lista de tipos de red se da en el archivo de encabezado Winnetwk.h (valores WNNC_NET_*). Por ejemplo, WNNC_NET_SHIVA es 0x00330000, por lo que la subclave de tipo correspondiente sería HKEY_CLASSES_ROOT\Tipo\ dered\51.
  • "network_provider_name" es un nombre de proveedor de red especificado por WNetGetProviderName, con los espacios convertidos en caracteres de subrayado. Por ejemplo, si el proveedor de red de redes de Microsoft está instalado, su nombre de proveedor es "Microsoft Windows Network" y el network_provider_name correspondiente es Microsoft_Windows_Network.

Ejemplo de registro de controlador de extensión

Para habilitar un controlador determinado, cree una subclave en la subclave de tipo de controlador de extensión con el nombre del controlador. Shell no usa el nombre del controlador, pero debe ser diferente de todos los demás nombres de esa subclave de tipo. Establezca el valor predeterminado de la subclave name en el formato de cadena del GUID del controlador.

En el ejemplo siguiente se muestran las entradas del Registro que habilitan los controladores de extensión de hoja de propiedades y menú contextual, mediante un tipo de archivo .myp de ejemplo.

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}

Inicialización de controladores de extensión de shell