我正在开发一组本质上是插件的东西,它们是 COM 服务器。每个插件都有一组由另一个组件管理的配置数据,配置数据的主键是插件的 ProgID。当插件需要访问配置项时,它会进行调用并传入其 ProgID 和所需属性的名称。这是一个遗留设计,我必须保持向后兼容性。
我现在需要加载每个插件的多个实例,每个实例都有一组不同的配置数据。我正在考虑的解决方案是为每个插件创建多个唯一的 ProgID,每个 ProgID 将指向该插件的单个 ClsId。因此,插件的每个实例都将通过其 ProgID 进行标识,ProgID 仍然用作配置数据的主键,并且所有内容都是 100% 向后兼容。
所以,问题是:
- 这是一种可以接受的技术吗? (多个 ProgID 全部指向一个 ClsID)。
- 当我的插件加载时,它能够知道使用哪个 ProgID 来创建它吗?
最佳答案
Prog id 通常有两种使用方式:检测与 prog id 对应的类 id(CLSIDFromProgID() 函数) - 这用于稍后调用 CoCreateInstance() - 以及检测给定类 id 的 prog id - 这通常用于显示类 ID 的人类友好版本。
这些映射意味着存在一个默认值等于类 id 的 HKCR{ProgId}\CLSID 键和一个默认值等于 ProgId 的 HKCR\CLSID{classid}\ProgID 键,这意味着该映射是一对一的。您将无法在一个类(class) ID 下拥有多个专业 ID。
通过调用 CoCreateInstance() 来加载 COM 组件,该 CoCreateInstance() 会传递一个类 ID - 通过任何可能的方式获得,包括使用 CLSIDFromProgID()。组件无法告知类 ID 是如何获取的。
关于windows - 多个ProgID可以指向同一个ClsID吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1739983/