在显示说明符中注册上下文菜单 COM 对象
在使用 COM 为 Active Directory 目录服务创建上下文菜单扩展 DLL 时,必须在 Windows 注册表和 Active Directory 域服务中注册该扩展,以便通知 Active Directory 管理 MMC 管理单元和 Windows shell 该扩展。
在 Windows 注册表中注册
与所有 COM 服务器一样,必须在注册表中注册上下文菜单扩展。 扩展会在以下键下进行注册。
HKEY_CLASSES_ROOT
CLSID
<clsid>
<clsid> 是 CLSID 的字符串表示形式,由 StringFromCLSID 函数生成。 <clsid> 键下有一个 InProcServer32 键,它可用于将对象标识为 32 位程序内服务器。 在 InProcServer32 键下,DLL 的位置会在默认值中指定,而线程模型则会在 ThreadingModel 值中指定。 所有上下文菜单扩展都必须使用“单元”线程模型。
注册 Active Directory 域服务
上下文菜单扩展注册只适用于一个区域设置。 如果上下文菜单扩展适用于所有区域设置,则它必须在显示说明符容器中的所有区域设置子容器的对象类 displaySpecifier 对象中注册。 如果上下文菜单扩展针对特定的本地化区域设置,则必须在该区域设置的子容器的 displaySpecifier 对象中注册。 有关 Display Specifiers 容器和区域设置的详细信息,请参阅显示说明符和 DisplaySpecifiers 容器。
上下文菜单扩展项可以在两种显示说明符属性下注册。 它们是 adminContextMenu 和 shellContextMenu。
adminContextMenu 属性用于标识在 Active Directory 管理单元中显示的管理上下文菜单。当用户在某个 Active Directory 管理 MMC 管理单元中显示相应类对象的上下文菜单时,上下文菜单就会出现。
shellContextMenu 属性标识要在 Windows shell 中显示的最终用户上下文菜单。 当用户在 Windows 资源管理器中查看相应类对象的上下文菜单时,上下文菜单就会出现。 从 Windows Server 2003 开始,Windows shell 就不再显示 Active Directory 域服务中的对象。
所有这些属性都是多值属性。
注册上下文菜单扩展时,adminContextMenu 和 shellContextMenu 属性的值需要采用以下格式。
<order number>,<clsid>
“<order number>”是一个无符号数字,表示上下文菜单中的项目位置。 显示上下文菜单时,将使用每个值的“<序号>”比较对值进行排序。 如果多个值具有相同的“<order number>”,则会按照从 Active Directory 服务器读取的顺序加载这些上下文菜单扩展。 如果可能,请使用不存在的“<order number>”,即一个未被属性中其他值使用过的值。 在“<order number>“序列中,没有规定的起始位置,也允许存在间隙。
“<clsid>”是 CLSID 的字符串形式,由 StringFromCLSID 函数生成。
在 Windows shell 中,支持多选上下文菜单项。 在这种情况下,每个选定对象都会调用上下文菜单扩展。 在 Active Directory 管理单元中,还支持多选上下文菜单扩展项。 在这种情况下,DSOBJECTNAMES 结构将为每个选定的 Directory 对象包含一个 DSOBJECT 结构。
重要
对于 Windows shell,显示说明符信息在用户登录时获取,并在用户会话中缓存。 对于管理单元,在加载管理单元时会检索显示说明符数据,并在进程过程中缓存这些数据。 对 Windows shell 而言,这意味着对显示说明符的更改会在用户注销并重新登录后生效。 对于管理单元,更改会在重新加载管理单元或控制台文件时生效,也就是说,如果启动控制台文件的新实例或新 Mmc.exe 实例并添加管理单元,就会检索到最新的显示说明符数据。
有关详细信息以及如何实现上下文菜单扩展的代码示例,请参阅请参阅实现上下文菜单 COM 对象的示例代码。