Windows ContextMenuHandler注册命名存在文档冲突,哪种方式正确?
Shell扩展上下文菜单处理程序的两种注册方式是否都有效?
问题背景
微软关于Shell处理程序的文档中,针对IContextMenu接口的注册出现了两种不同的描述:
在Handler Names章节中给出的示例结构为:
HKEY_CLASSES_ROOT MyProgram.1 ShellEx ContextMenuHandlers并说明:
在“Handler Subkey name”键下创建一个子键,其名称为Shell扩展的CLSID字符串版本。
在Extension Handler Registration示例章节中则说明:
要启用特定处理程序,请在扩展处理程序类型键下创建一个以处理程序名称命名的子键……将该名称子键的默认值设置为处理程序GUID的字符串形式。
对应的示例结构为:Shellex ContextMenuHandler MyCommand (Default) = {00000000-1111-2222-3333-444444444444}
实际查看系统注册表时,两种注册方式都存在:有的直接用GUID作为子键名,有的用友好名称作为子键名并在默认值中存储GUID。
答案
两种注册方式都完全可行,功能上没有区别:
- 直接使用CLSID作为子键名:系统会直接将子键名识别为CLSID,无需读取额外的默认值,这是一种更直接的早期注册方式。
- 使用友好名称作为子键名+默认值存储CLSID:这种方式的优势在于子键名更具可读性,能直观体现处理程序的用途,是微软推荐的更清晰的注册方式。
系统在加载Shell扩展时会兼容两种逻辑:如果子键名是合法的GUID格式,就直接使用该值;如果不是,则读取该子键的默认值作为CLSID来加载对应的处理程序。
内容的提问来源于stack exchange,提问作者user3161924
相关产品推荐
相关产品推荐

