在显示说明符中注册上下文菜单 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 容器

上下文菜单扩展项可以在两种显示说明符属性下注册。 它们是 adminContextMenushellContextMenu

adminContextMenu 属性用于标识在 Active Directory 管理单元中显示的管理上下文菜单。当用户在某个 Active Directory 管理 MMC 管理单元中显示相应类对象的上下文菜单时,上下文菜单就会出现。

shellContextMenu 属性标识要在 Windows shell 中显示的最终用户上下文菜单。 当用户在 Windows 资源管理器中查看相应类对象的上下文菜单时,上下文菜单就会出现。 从 Windows Server 2003 开始,Windows shell 就不再显示 Active Directory 域服务中的对象。

所有这些属性都是多值属性。

注册上下文菜单扩展时,adminContextMenushellContextMenu 属性的值需要采用以下格式。

<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 对象的示例代码