注册 Shell 扩展处理程序
必须先注册 Shell 扩展处理程序对象,然后 Shell 才能使用它。 本主题是有关如何注册 Shell 扩展处理程序的一般讨论。
每当创建或更改 Shell 扩展处理程序时,请务必通知系统你已进行更改。 为此,请调用 SHChangeNotify 并指定 SHCNE_ASSOCCHANGED 事件。 如果不调用 SHChangeNotify,则在重新启动系统之前可能无法识别更改。
有一些其他因素适用于 Windows 2000 系统。 有关详细信息,请参阅 在 Windows 2000 系统上注册 Shell 扩展处理程序 部分。
与所有组件对象模型 (COM) 对象一样,必须使用 windows 软件开发工具包 (SDK) 随附的工具(如 Guidgen.exe)为处理程序创建 GUID。 HKEY_CLASSES_ROOTCLSID 下\创建一个子项,其名称是该 GUID 的字符串形式。 由于 Shell 扩展处理程序是进程内服务器,因此还必须在该 GUID 子项下创建 InprocServer32 子项,并将 (Default) 值设置为处理程序的 DLL 的路径。 使用单元线程模型。 下面显示了一个示例:
HKEY_CLASSES_ROOT
CLSID
{00021500-0000-0000-C000-000000000046}
InprocServer32
(Default) = %windir%\System32\Example.dll
ThreadingModel = Apartment
每当 Shell 执行可能涉及 Shell 扩展处理程序的操作时,它都会检查相应的注册表子项。 注册扩展处理程序的子项控制何时调用扩展处理程序。 例如,当 Shell 显示 文件类型成员的快捷菜单时,常见的做法是使用名为 的快捷菜单处理程序。 在这种情况下,必须在文件类型的 ProgID 子项下注册处理程序。
本主题讨论以下主题:
处理程序名称
若要启用 Shell 扩展处理程序,请使用处理程序子项名称创建一个子项, (请参阅下面的) ,在文件类型的 ProgID (的 ShellEx 子项下) 或predefined_shell_objects) 的 Shell 对象类型名称 (。
例如,如果要为 MyProgram.1 注册快捷菜单扩展处理程序,请首先创建以下子项:
HKEY_CLASSES_ROOT
MyProgram.1
ShellEx
ContextMenuHandlers
对于以下处理程序,请在名为 的“处理程序子项名称”子项下创建一个子项,作为 Shell 扩展的 CLSID) 类标识符 (字符串版本。 通过创建多个子项,可以在处理程序子项名称下注册多个扩展。
Handler | 接口 | 处理程序子项名称 |
---|---|---|
列提供程序处理程序 | IColumnProvider | ColumnHandlers |
快捷菜单处理程序 | IContextMenu | ContextMenuHandlers |
Copyhook 处理程序 | ICopyHook | CopyHookHandlers |
拖放处理程序 | IContextMenu | DragDropHandlers |
属性表处理程序 | IShellPropSheetExt | PropertySheetHandlers |
对于以下处理程序,“处理程序子项名称”键的默认值是 Shell 扩展的 CLSID 的字符串版本。 只能为这些处理程序注册一个扩展。
Handler | 接口 | 处理程序子项名称 |
---|---|---|
数据处理程序 | IDataObject | DataHandler |
删除处理程序 | IDropTarget | DropHandler |
图标处理程序 | IExtractIconA/W | IconHandler |
缩略图处理程序 | IThumbnailProvider | {E357FCCD-A995-4576-B01F-234630154E96} |
Infotip 处理程序 | IQueryInfo | {00021500-0000-0000-C000-0000000000046} |
(ANSI) 的 Shell 链接 | IShellLinkA | {000214EE-0000-0000-C000-000000000046} |
shell 链接 (UNICODE) | 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 条目的文件类型才需要指定用于将“固定到开始菜单”和“固定到任务栏”的子项。
预定义的 Shell 对象
Shell 在 HKEY_CLASSES_ROOT 下定义其他对象,这些对象可以采用与文件类型相同的方式进行扩展。 例如,若要为所有文件添加属性表处理程序,可以在 PropertySheetHandlers 子项下注册。
HKEY_CLASSES_ROOT
*
shellex
PropertySheetHandlers
下表提供了可在其中注册扩展处理程序的 HKEY_CLASSES_ROOT 的各种子项。 请注意,许多扩展处理程序不能在所有列出的子项下注册。 有关更多详细信息,请参阅特定处理程序的文档。
子项 | 描述 | 可能的处理程序 |
---|---|---|
* | 所有文件 | 快捷菜单、属性表、谓词 (请参阅下文) |
AllFileSystemObjects | 所有文件和文件夹 | 快捷菜单、属性表、谓词 |
文件夹 | 全部文件夹 | 快捷菜单、属性表、谓词 |
Directory | 文件夹 | 快捷菜单、属性表、谓词 |
Directory\Background | 文件文件夹背景 | 仅快捷菜单 |
DesktopBackground | Windows 7 及更高版本 (桌面背景) | 快捷菜单,谓词 |
驱动 | MyComputer 中的所有驱动器,例如“C:\” | 快捷菜单、属性表、谓词 |
Network | “我的网络位置”下的整个网络 () | 快捷菜单、属性表、谓词 |
Network\Type\# | 类型为 # 的所有对象 (请参阅以下) | 快捷菜单、属性表、谓词 |
NetShare | 所有网络共享 | 快捷菜单、属性表、谓词 |
NetServer | 所有网络服务器 | 快捷菜单、属性表、谓词 |
network_provider_name | 网络提供程序“network_provider_name”提供的所有对象 | 快捷菜单、属性表、谓词 |
打印机 | 所有打印机 | 快捷菜单,属性表 |
AudioCD | CD 驱动器中的音频 CD | 仅谓词 |
Dvd | WINDOWS 2000) (DVD 驱动器 | 快捷菜单、属性表、谓词 |
说明
- 可通过右键单击文件夹内的文件文件夹来访问文件文件夹背景快捷菜单,但不能通过文件夹的任何内容进行访问。
- “谓词”是在 HKEY_CLASSES_ROOT\子键\Shell\谓词下注册的特殊命令。
- 对于 “网络\类型\#”,“#”是网络提供程序类型代码(以十进制表示)。 网络提供程序类型代码是网络类型的高字。 Winnetwk.h 头文件中提供了网络类型列表,) (WNNC_NET_* 值。 例如,WNNC_NET_SHIVA 0x00330000,因此相应的类型子项将 HKEY_CLASSES_ROOT\网络\类型\51。
- “network_provider_name”是 WNetGetProviderName 指定的网络提供程序名称,其中空格转换为下划线。 例如,如果安装了 Microsoft 网络提供商,则其提供程序名称为“Microsoft Windows 网络”,并且Microsoft_Windows_Network相应的network_provider_name。
扩展处理程序注册示例
若要启用特定处理程序,请在扩展处理程序类型子项下创建一个具有处理程序名称的子项。 Shell 不使用处理程序的名称,但它必须与该类型子项下的所有其他名称不同。 将名称子项的默认值设置为处理程序 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}
相关主题