2

我正在研究一组本质上是插件的东西,它们是 COM 服务器。每个插件都有一组配置数据,由另一个组件管理,配置数据的主键是插件的 ProgID。当插件需要访问配置项时,它会进行调用并传入其 ProgID 和所需属性的名称。这是一个遗留设计,我必须保持向后兼容性。

我现在需要加载每个插件的多个实例,每个实例都有一组不同的配置数据。我正在考虑的解决方案是为每个插件创建多个唯一的 ProgID,每个 ProgID 将指向插件的单个 ClsId。因此,插件的每个实例都将由其 ProgID 标识,ProgID 仍用作配置数据的主键,并且所有内容都是 100% 向后兼容的。

所以,问题:

  1. 这是一种可接受的技术吗?(多个 ProgID 都指向一个 ClsID)。
  2. 当我的插件加载时,它能够分辨出使用哪个 ProgID 来创建它吗?
4

1 回答 1

5

Prog id 通常以两种方式使用:检测对应于 prog id 的类 id(CLSIDFromProgID() 函数) - 这用于稍后调用 CoCreateInstance() - 并检测给定类 id 的 prog id - 这是通常用于显示类 id 的人性化版本。

这些映射意味着有一个 HKCR{ProgId}\CLSID 键,其默认值等于类 id 和一个 HKCR\CLSID{classid}\ProgID 键,其默认值等于 ProgId,这意味着映射是一一对一。您将无法在一个类 id 下拥有多个 prog id。

COM 组件是通过调用 CoCreateInstance() 来加载的,CoCreateInstance() 会传递一个类 id - 可以通过任何可能的方式获得,包括使用 CLSIDFromProgID()。组件没有办法知道类 id 是如何获得的。

于 2009-11-16T07:25:47.630 回答