Registrar controladores de extensiones del Shell

Se debe registrar un objeto controlador de extensiones 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, consulte la sección Registro de controladores de extensiones de shell en Windows 2000 Systems.

Al igual que con todos los objetos component Object Model (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 debajo de HKEY_CLASSES_ROOT\CLSID cuyo nombre sea la representación en cadena de ese GUID. Dado que los manejadores de extensiones del Shell son servidores en proceso, también debe crear una subclave InprocServer32 bajo esa subclave GUID con el valor (Predeterminado) establecido en la ruta de acceso a la DLL del manejador. Use el modelo de subprocesos de apartamento. Aquí se muestra un ejemplo:

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

Importante

ThreadingModel debe ser Apartment para manipuladores de extensiones de shell. Las vistas de carpetas y el Explorador se ejecutan en un apartamento de un solo hilo (STA). Usar modelos de subprocesamiento Free o Both puede provocar errores intermitentes, interbloqueos o fallos difíciles de diagnosticar.

En el caso de las aplicaciones de escritorio empaquetadas (MSIX), es preferible usar el registro basado en el manifiesto mediante el elemento desktop4:Extension en lugar de escribir directamente claves en el Registro. Esto garantiza una identidad de paquete adecuada y una desinstalación limpia.

Cada vez que Shell realiza una acción que puede requerir la intervención de un manejador de extensiones de Shell, comprueba la subclave apropiada del Registro. La subclave bajo la que se registra un controlador para extensiones determina cuándo se invocará. Por ejemplo, es una práctica habitual tener un controlador de menú contextual que se invoque cuando el Shell muestra un menú contextual para un miembro de un tipo de archivo. En este caso, el controlador debe registrarse 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 subclave del controlador (consulte más abajo) bajo la subclave ShellEx de ProgID (para tipos de archivo) o del 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 subclave siguiente:

HKEY_CLASSES_ROOT
   MyProgram.1
      ShellEx
         ContextMenuHandlers

Para los siguientes manipuladores, cree una subclave debajo de la subclave "Handler Subkey name" con el nombre correspondiente a la representación en cadena del identificador de clase (CLSID) de la extensión del Shell. Se pueden registrar varias extensiones en el nombre de subclave del controlador mediante la creación de varias subclaves.

Controlador Interface Nombre de subclave del controlador
Controlador de proveedor de columnas IColumnProvider ColumnHandlers
Controlador de menú contextual IContextMenu ContextMenuHandlers
Gestor del gancho de copia 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 Interface Nombre de subclave del controlador
Controlador de datos IDataObject DataHandler
Controlador de acción de soltar IDropTarget DropHandler
Controlador de iconos IExtractIconA/W IconHandler
Gestor de miniaturas 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-00000000046}
Vínculo de Shell (UNICODE) IShellLinkW {000214F9-0000-0000-C000-00000000046}
Almacenamiento estructurado IStorage {0000000B-0000-0000-C000-000000000046}
Metadata 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 del acceso directo de un elemento solo son necesarias para los tipos de archivo que incluyen la entrada IsShortCut.

Objetos predefinidos del shell

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 Controladores posibles
* 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
Folder Todas las carpetas Menú contextual, Hoja de propiedades, Verbos
Directory Carpetas de archivos Menú contextual, Hoja de propiedades, Verbos
Directorio\Segundo plano Fondo de la carpeta de archivos Solo menú contextual
DesktopBackground Fondo de escritorio (Windows 7 y versiones posteriores) Menú de acceso directo, Verbos
Drive Todas las unidades de MyComputer, como "C:\" Menú contextual, Hoja de propiedades, Verbos
Red 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
Printers Todas las impresoras Menú contextual, Ficha 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\Subclave\Shell\Verbo.
  • Para Red\tipo\#, "#" es un código decimal del tipo de proveedor de red. 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 de red\\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 está instalado el proveedor de red de Microsoft Networking, su nombre de proveedor es "Microsoft Windows Network" y el network_provider_name correspondiente es Microsoft_Windows_Network.

Ejemplo de registro de un controlador de extensiones

Para habilitar un controlador determinado, cree una subclave bajo 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.

El ejemplo siguiente ilustra las entradas del Registro que habilitan los controladores de extensión del menú contextual y de la hoja de propiedades, usando como ejemplo el tipo de archivo .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}

Iniciando controladores de extensiones del shell