Регистрация обработчиков расширений оболочки
Объект обработчика расширения оболочки должен быть зарегистрирован, прежде чем оболочка сможет его использовать. В этом разделе описывается, как зарегистрировать обработчик расширений оболочки.
При создании или изменении обработчика расширений оболочки важно уведомлять систему о том, что вы внесли изменения. Для этого вызовите SHChangeNotify, указав событие SHCNE_ASSOCCHANGED . Если не вызвать SHChangeNotify, изменение может быть не распознано до перезагрузки системы.
Существуют некоторые дополнительные факторы, которые применяются к системам Windows 2000. Дополнительные сведения см. в разделе Регистрация обработчиков расширений оболочки в системах Windows 2000 .
Как и для всех com-объектов, необходимо создать GUID для обработчика с помощью средства, такого как Guidgen.exe, который входит в состав пакета SDK для Windows. Создайте подраздел в 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 | ColumnHandlers |
Обработчик контекстного меню | IContextMenu | ContextMenuHandlers |
Обработчик copyhook | ICopyHook | CopyHookHandlers |
Обработчик действия перетаскивания | IContextMenu | DragDropHandlers |
Обработчик страницы свойств | IShellPropSheetExt | PropertySheetHandlers |
Для следующих обработчиков значением по умолчанию ключа Handler Subkey Name является строковая версия CLSID расширения оболочки. Для этих обработчиков можно зарегистрировать только одно расширение.
Обработчик | Интерфейс | Имя подраздела обработчика |
---|---|---|
Обработчик данных | Idataobject | DataHandler |
Обработчик перетаскивания | IDropTarget | DropHandler |
Обработчик значков | IExtractIconA/W | IconHandler |
Обработчик эскизов изображений | IThumbnailProvider | {E357FCCD-A995-4576-B01F-234630154E96} |
Обработчик подсказок | IQueryInfo | {00021500-0000-0000-C000-0000000000046} |
Ссылка на оболочку (ANSI) | IShellLinkA | {000214EE-0000-0000-C000-000000000046} |
Ссылка на оболочку (ЮНИКОД) | IShellLinkW | {000214F9-0000-0000-C000-0000000000046} |
Структурированное хранилище | IStorage | {0000000B-0000-0000-C000-0000000000046} |
Метаданные | IPropertySetStorage | PropertyHandler |
Закрепление в меню "Пуск" | 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 | Все файлы и папки файлов | Контекстное меню, страница свойств, глаголы |
Папка | Все папки | Контекстное меню, страница свойств, глаголы |
Каталог | Папки файлов | Контекстное меню, страница свойств, глаголы |
Каталог\Фон | Фон папки файлов | Только контекстное меню |
DesktopBackground | Фон рабочего стола (Windows 7 и более поздние версии) | Контекстное меню, глаголы |
Диске | Все диски в MyComputer, например "C:\" | Контекстное меню, страница свойств, глаголы |
Network | Вся сеть (в разделе Мои сетевые расположения) | Контекстное меню, страница свойств, глаголы |
Network\Type\ # | Все объекты типа # (см. ниже) | Контекстное меню, страница свойств, глаголы |
NetShare | Все сетевые ресурсы | Контекстное меню, страница свойств, глаголы |
NetServer | Все сетевые серверы | Контекстное меню, страница свойств, глаголы |
network_provider_name | Все объекты, предоставляемые поставщиком сети "network_provider_name" | Контекстное меню, страница свойств, глаголы |
принтеры; | Все принтеры | Контекстное меню, страница свойств |
AudioCD | Аудио компакт-диск в CD-дисководе | Только глаголы |
DVD | DVD-накопитель (Windows 2000) | Контекстное меню, страница свойств, глаголы |
Примечания
- Чтобы открыть контекстное меню фона файловой папки, щелкните правой кнопкой мыши в папке файлов, но не по содержимому папки.
- "Verbs" — это специальные команды, зарегистрированные в HKEY_CLASSES_ROOT\ командоболочки подраздела\\.
- Длятипа\#сети\ "#" — это код типа сетевого поставщика в десятичном формате. Код типа сетевого поставщика — это высокое слово типа сети. Список типов сети приведен в файле заголовка Winnetwk.h (значения WNNC_NET_*). Например, WNNC_NET_SHIVA 0x00330000, поэтому соответствующий подраздел типа будет HKEY_CLASSES_ROOT\Тип\сети\51.
- "network_provider_name" — это имя поставщика сети, указанное в WNetGetProviderName, с пробелами, преобразованными в символы подчеркивания. Например, если установлен поставщик сетевых сетей Майкрософт, его имя поставщика — "Сеть Microsoft Windows", а соответствующий network_provider_name— Microsoft_Windows_Network.
Пример регистрации обработчика расширений
Чтобы включить определенный обработчик, создайте подраздел в подразделе типа обработчика расширений с именем обработчика. В оболочке не используется имя обработчика, но оно должно отличаться от всех других имен в подразделе этого типа. Задайте значение по умолчанию подраздела name в строковой форме 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}
Связанные темы