Регистрация обработчиков расширений оболочки
Объект обработчика расширений оболочки должен быть зарегистрирован, прежде чем оболочка сможет его использовать. В этом разделе описывается, как зарегистрировать обработчик расширения оболочки.
При создании или изменении обработчика расширения оболочки важно уведомить систему о том, что вы внесли изменения. Для этого вызовите 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_name — Microsoft_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}
Связанные разделы