windows - 多个ProgID可以指向同一个ClsID吗?

标签 windows com com-interop ole progid

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

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

所以,问题是:

  1. 这是一种可以接受的技术吗? (多个 ProgID 全部指向一个 ClsID)。
  2. 当我的插件加载时,它能够知道使用哪个 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/

相关文章:

asp.net - 使用经典 ADO 的 Recordset.Type 属性的 MissingMethodException

objective-c - 在 Windows 上为 ios 应用程序编译 objective-c 代码

windows - RegSvr32.exe的/n和/i参数有什么区别?

windows - 以 Start-Job 开始的 PowerShell 作业的事件名称

python - 为什么 python 可执行文件在 Windows 上调用多处理模块的函数时打开新窗口实例

c# - 在 C# COM 中处理 NULL 指针输出参数

c# - 如何从 C++ 向 COM 公开带有 IHTMLDocument* 类型参数的方法?

memory-management - 使用 CoTaskMemAlloc 时,我应该始终调用 CoTaskMemFree 吗?

c# - 关于 C# 中线程的奇怪消息

.net - 使用 IDisposable 清理 Excel 互操作对象