组件类别管理器实现

随着可用组件的数量的增长,管理这些组件变得越来越困难。 就它们公开的接口以及它们执行的任务而言,许多组件提供类似的功能。

通常需要枚举可在特定上下文中使用的组件。 例如,在 OLE 复合文档中使用的“插入对象”对话框和 OLE 控件中使用的 “插入控件” 对话框。 这些对话框列出满足(或声明要履行)复合文档或控件的接口协定的所有组件。 这些现有类别(OLE 文档、OLE 控件)并不表示确切的接口签名。 OLE 文档必须公开一组特定的核心接口(例如,IOleObjectIPersistStorage),但也可以公开其他接口,例如 IOleLink

过去,组件通过向与组件对应的 HKEY_CLASSES_ROOT\CLSID\{...} 注册表项添加可读名称(“Insertable”、“Control”等)来标记组件。 这适用于类别的中心定义,但当许多独立方定义新类别时,可能会发生名称冲突。 与 COM 的其他领域一样,提供可扩展命名空间的解决方案在于使用全局唯一标识符(GUID)。 将唯一的数字(CATID)分配给每个类别,而不是使用人类可读的名称。

现有分类的另一个限制是,它仅限于表达组件本身的功能。 许多组件需要容器中的某些功能。 将此类组件插入容器时,即使组件满足其类别之一隐含的协定,插入也可能意外失败或行为意外。 若要枚举在某些情况下可以成功使用的组件,必须考虑组件和容器的功能。

由于这些注意事项,对现有分类进行了以下更改:

  • 使用全局唯一标识符的 CATID 来指示类别。
  • HKEY_CLASSES_ROOT\CLSID 注册表项的 组件 子项下,开发了两个单独的子项“已实现类别”和“必需类别”。 这些子项包含组件提供或组件容器必须提供的 CAT ID 列表。

为了简化组件类别的管理,类别列在注册表的中心位置:HKEY_CLASSES_ROOT\Component Categories。 此密钥列出已安装的类别及其 CATID 和本地化的、可读的名称。

有关详细信息,请参阅以下主题: