不同 类 重复 ProgId 的可能后果
Possible consequences of duplicate ProgId for different classes
在我维护的软件中,我观察到 COM 类 标有相同的 [ProgId]
s.
AFAIK ProgId 是组件的人类可读标识符,它应该与组件的 CLSID 一对一映射。
所以我想知道:
不同的类有相同的ProgId吗?
可能的后果是什么? (除了无法使用这种方便的方式访问组件)
提前致谢。
ProgId 为 coclass 的 CLSID guid 提供了一个友好的名称。对脚本语言很重要,没有很好的方法来了解 guid。也用于支持后期绑定的语言,如 VB.NET 和 C#。从字符串到 guid 的转换发生在运行时。工厂函数的通常名称是 CreateObject(),语言运行时通过查看存储在 HKLM\Software\Classes.
中的注册表项来实现它
这是您复制它们时会出现什么问题的提示。客户端程序创建的实际对象是随机的。以最后注册的为准。客户端程序调用了与它打算调用的方法完全不同的方法。这 可能 触发 DISP_E_Xxxx 错误 return 但这当然不能保证。总的来说,这是一个非常令人讨厌且无法调试的事故。
唯一不会出现此问题的方法是客户端代码使用早期绑定并使用类型库来了解 guid。这并不罕见,但不在您的控制范围内。如果您知道客户端代码不使用它们,则只需省略 [ProgId] 属性,这样就不会发生意外。
在我维护的软件中,我观察到 COM 类 标有相同的 [ProgId]
s.
AFAIK ProgId 是组件的人类可读标识符,它应该与组件的 CLSID 一对一映射。
所以我想知道:
不同的类有相同的ProgId吗?
可能的后果是什么? (除了无法使用这种方便的方式访问组件)
提前致谢。
ProgId 为 coclass 的 CLSID guid 提供了一个友好的名称。对脚本语言很重要,没有很好的方法来了解 guid。也用于支持后期绑定的语言,如 VB.NET 和 C#。从字符串到 guid 的转换发生在运行时。工厂函数的通常名称是 CreateObject(),语言运行时通过查看存储在 HKLM\Software\Classes.
中的注册表项来实现它这是您复制它们时会出现什么问题的提示。客户端程序创建的实际对象是随机的。以最后注册的为准。客户端程序调用了与它打算调用的方法完全不同的方法。这 可能 触发 DISP_E_Xxxx 错误 return 但这当然不能保证。总的来说,这是一个非常令人讨厌且无法调试的事故。
唯一不会出现此问题的方法是客户端代码使用早期绑定并使用类型库来了解 guid。这并不罕见,但不在您的控制范围内。如果您知道客户端代码不使用它们,则只需省略 [ProgId] 属性,这样就不会发生意外。