Поделиться через


Регистрация обработчиков расширений оболочки

Объект обработчика расширений оболочки должен быть зарегистрирован, прежде чем оболочка сможет его использовать. В этом разделе описывается, как зарегистрировать обработчик расширения оболочки.

При создании или изменении обработчика расширения оболочки важно уведомить систему о том, что вы внесли изменения. Для этого вызовите SHChangeNotify, указав событие SHCNE_ASSOCCHANGED. Если вы не вызываете SHChangeNotify, изменение может быть не распознано до перезагрузки системы.

Существуют некоторые дополнительные факторы, которые применяются к системам Windows 2000. Дополнительные сведения см. в разделе Регистрация обработчиков расширений оболочки в системах Windows 2000.

Как и в случае со всеми объектами объектной модели компонентов (COM), необходимо создать GUID для обработчика с помощью средства, например Guidgen.exe, который предоставляется пакетом средств разработки программного обеспечения Windows (SDK). Создайте подраздел в разделе HKEY_CLASSES_ROOT\CLSID, имя которого является строковой формой этого GUID. Так как обработчики расширений оболочки являются внутренними серверами, необходимо также создать подраздел InprocServer32 под ключом GUID и установить значение (по умолчанию) на путь к библиотеке DLL обработчика. Используйте апартаментную модель потоков. Ниже показан пример:

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

В любой момент, когда оболочка совершает действие, которое может включать модуль расширения оболочки, она проверяет соответствующий подраздел реестра. Подключ, под которым зарегистрирован обработчик расширений, определяет, когда он будет вызываться. Например, обычно используется обработчик контекстного меню, вызываемый при отображении контекстного меню для члена типа файла. В этом случае обработчик должен быть зарегистрирован в подразделе ProgID типа файла.

В этом разделе рассматриваются следующие темы:

Имена обработчиков

Чтобы включить обработчик расширения Оболочки, создайте подраздел с именем подраздела обработчика (см. ниже) в подразделе ShellEx ProgID (для типов файлов) или имени типа объекта Оболочки (для predefined_shell_objects).

Например, если вы хотите зарегистрировать обработчик расширения контекстного меню для MyProgram.1, сначала создайте следующий подраздел:

HKEY_CLASSES_ROOT
   MyProgram.1
      ShellEx
         ContextMenuHandlers

Для следующих обработчиков создайте подраздел под ключом "Имя подраздела Обработчика", названный строковым представлением идентификатора класса (CLSID) расширения оболочки. Несколько расширений можно зарегистрировать в подразделе обработчика, создав для них несколько отдельных ключей.

Обработчик Интерфейс Имя подраздела обработчика
Обработчик поставщика столбцов IColumnProvider ОбработчикиСтолбцов
Обработчик контекстного меню IContextMenu ContextMenuHandlers
Обработчик копирования ICopyHook CopyHookHandlers
Обработчик перетаскивания IContextMenu обработчики перетаскивания
Обработчик листа свойств IShellPropSheetExt ОбработчикиЛистовСвойств

 

Для следующих обработчиков значение по умолчанию ключа "Имя подраздела обработчика" является строковой версией CLSID расширения оболочки. Для этих обработчиков можно зарегистрировать только одно расширение.

Обработчик Интерфейс Имя подраздела ключа обработчика
Обработчик данных IDataObject Обработчик данных
Обработчик удаления IDropTarget DropHandler
Обработчик значков IExtractIconA/W IconHandler
Обработчик эскизов изображений IThumbnailProvider {E357FCCD-A995-4576-B01F-234630154E96}
Обработчик подсказок IQueryInfo {00021500-0000-0000-C000-000000000046}
Ссылка оболочки (ANSI) IShellLinkA {000214EE-0000-0000-C000-000000000046}
Ссылка командной оболочки (ЮНИКОД) IShellLinkW {000214F9-0000-0000-C000-000000000046}
Структурированное хранилище IStorage {0000000B-0000-0000-C000-000000000046}
Метаданные IPropertySetStorage ОбработчикСвойств
Закрепление в меню "Пуск" IStartMenuPinnedList {a2a9545d-a0c2-42b4-9708-a0b2badd77c8}
Закрепить на панели задач {90AA3A4E-1CBA-4233-B8BB-535773D48449}

 

Подразделы, указанные для добавления Закрепить в меню "Пуск" и Закрепить на панели задач в ярлык элемента, требуются только для типов файлов, включающих запись IsShortCut.

Предопределенные объекты оболочки

Шелл определяет дополнительные объекты в HKEY_CLASSES_ROOT, которые могут быть расширены таким же образом, как и типы файлов. Например, чтобы добавить обработчик листа свойств для всех файлов, можно зарегистрироваться в подразделе PropertySheetHandlers.

HKEY_CLASSES_ROOT
   *
      shellex
         PropertySheetHandlers

В следующей таблице приведены различные подразделы HKEY_CLASSES_ROOT, в которых регистрируются обработчики расширений. Обратите внимание, что многие обработчики расширений не могут быть зарегистрированы во всех перечисленных подразделах. Дополнительные сведения см. в документации конкретного обработчика.

Подраздел Описание Возможные обработчики
* Все файлы Контекстное меню, лист свойств, команды (см. ниже)
AllFileSystemObjects Все файлы и папки файлов Контекстное меню, лист свойств, команды
папки Все папки Контекстное меню, лист свойств, команды
Каталог Папки файлов Контекстное меню, лист свойств, команды
Directory\Background Фон папки файла Только контекстное меню
Фон рабочего стола Фон рабочего стола (Windows 7 и более поздние версии) Контекстное меню, глаголы
диск Все диски в MyComputer, такие как "C:\" Контекстное меню, лист свойств, команды
Сеть Вся сеть (в разделе "Мои сетевые места") Контекстное меню, лист свойств, команды
Network\Type\# Все объекты типа # (см. ниже) Контекстное меню, лист свойств, команды
NetShare Все сетевые ресурсы Контекстное меню, лист свойств, команды
NetServer Все сетевые серверы Контекстное меню, лист свойств, команды
network_provider_name Все объекты, предоставляемые поставщиком сети "network_provider_name" Контекстное меню, лист свойств, команды
принтеры Все принтеры Контекстное меню, лист свойств
АудиоCD Аудио CD в CD-приводе Только глаголы
DVD DVD-диск (Windows 2000) Контекстное меню, таблица свойств, глаголы

 

Примечания

  • Контекстное меню фона папки файлов можно открыть щелчком правой кнопкой мыши внутри папки, но не на содержимом папки.
  • "Команды" — это специальные команды, зарегистрированные в разделе HKEY_CLASSES_ROOT\Подраздел\оболочки\командой.
  • Для сети типа\типа\#"#" — это код типа поставщика сети в десятичной системе. Код типа поставщика сети — это старшее слово типа сети. Список типов сети представлен в файле заголовка Winnetwk.h (значения WNNC_NET_*). Например, WNNC_NET_SHIVA это 0x00330000, поэтому соответствующий подраздел типа будет HKEY_CLASSES_ROOT\Network\Type\51.
  • "network_provider_name" — это имя поставщика сети, указанное WNetGetProviderNameс пробелами, преобразованными в символы подчеркивания. Например, если установлен поставщик сети Microsoft Network, его имя — Microsoft Windows Network, а соответствующий network_provider_nameMicrosoft_Windows_Network.

Пример регистрации обработчика расширений

Чтобы включить конкретный обработчик, создайте подраздел в подразделе типа обработчика расширения с именем обработчика. Оболочка не использует имя обработчика, но оно должно отличаться от всех остальных имен в подразделе тип. Установите для подсписка имени значение по умолчанию в строковой форме GUID обработчика.

В следующем примере показаны записи реестра, которые позволяют включить контекстное меню и обработчики расширений листа свойств, используя пример типа файла 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}

Инициализация обработчиков расширений оболочки