重复ProgId对不同类的可能后果

时间:2015-06-04 17:37:47

标签: c# .net windows com

在我维护的软件中,我观察到 COM类标有相同的[ProgId] s。

AFAIK ProgId 是组件的人类可读标识符,它应该与组件的 CLSID 进行1对1的映射。

所以我想知道:

  • 是否有充分理由为不同的课程提供相同的 ProgId

  • 可能产生的后果是什么? (除非无法使用这种方便的方式到达组件)

提前致谢。

1 个答案:

答案 0 :(得分:1)

ProgId为coclass的CLSID guid提供友好名称。对脚本语言很重要,没有很好的方法来了解guid。也支持后期绑定的语言,如VB.NET和C#。从字符串到guid的转换在运行时发生。工厂函数的通常名称是CreateObject(),语言运行库通过查看存储在HKLM \ Software \ Classes中的注册表项来实现它。

当你复制它们时会出现什么问题,这是你的提示。客户端程序创建的实际对象是随机的。无论哪一个碰巧在最后登记。客户端程序调用与其打算调用的方法完全不同的方法。此可能触发DISP_E_Xxxx错误返回,但这当然不能保证。总的来说,这是一个非常令人讨厌且非常不可饶恕的事故。

唯一可以解决此问题的方法是客户端代码使用早期绑定并使用类型库来了解guid。这并不罕见,但不在你的掌控之中。如果您知道客户端代码不使用它们,那么只需省略[ProgId]属性,这样就不会发生意外。