组件类别管理器实现
随着可用组件的数量的增长,管理这些组件变得越来越困难。 就公开的接口以及执行的任务而言,许多组件提供类似的功能。
通常需要枚举可在特定上下文中使用的组件。 例如,在 OLE 复合文档中使用的“插入对象”对话框和在 OLE 控件中使用的“插入控件”对话框。 这些对话框会列出满足(或声明满足)复合文档或控件的接口协定的所有组件。 这些现有类别(OLE 文档、OLE 控件)并不表示确切的接口签名。 OLE 文档必须公开一组特定的核心接口(例如 IOleObject 或 IPersistStorage),但也可以公开其他接口,如 IOleLink。
过去,组件在与组件对应的 HKEY_CLASSES_ROOT\CLSID\{...} 注册表项中添加可读名称(“Insertable”、“Control”等)作为子项来标记组件。 这适用于类别的中心定义,但当许多独立方定义新类别时,可能会发生名称冲突。 与 COM 的其他区域一样,提供可扩展命名空间的解决方案在于使用全局唯一标识符 (GUID)。 将唯一的数字 (CATID) 分配给每个类别,而不是使用人类可读名称。
现有分类的另一个限制是,它仅限于表达组件本身的功能。 许多组件需要容器中的某些功能。 将此类组件插入容器时,即使组件满足其类别之一表示的协定,插入也可能会失败或出现意外行为。 若要枚举在某些情况下可以成功使用的组件,必须考虑组件和容器的功能。
由于这些注意事项,对现有分类进行了以下更改:
- 使用作为全局唯一标识符的 CATID 来指示类别。
- 在 HKEY_CLASSES_ROOT\CLSID 注册表项的 Components 子项下,开发了两个单独的子项,即“Implemented Categories”和“Required Categories”。 这些子项包含组件提供或组件容器必须提供的 CAT ID 列表。
为了简化组件类别的管理,在注册表中的中心位置列出了类别:HKEY_CLASSES_ROOT\Component Categories。 此项列出已安装的类别及其 CATID 和本地化的可读名称。
有关详情,请参阅以下主题: