不同类重复ProgId的可能后果

本文关键字:后果 ProgId 同类 | 更新日期: 2023-09-27 17:53:17

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

ProgId是一个可读的组件标识符,它应该与组件的CLSID一一对应。

所以我想知道:

  • 有什么好的理由有相同的ProgId为不同的类?

  • 可能的后果是什么?(除了不能使用这种方便的方式到达组件)

不同类重复ProgId的可能后果

ProgId为协类的CLSID向导提供了一个友好的名称。对于脚本语言来说很重要,但了解向导并不是一个好方法。支持后期绑定的语言也会使用,比如VB。。NET和c#。从字符串到guid的转换发生在运行时。工厂函数的通常名称是CreateObject(),语言运行时通过查看存储在HKLM'Software'Classes中的注册表项来实现它。

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

避免这个问题的唯一方法是当客户端代码使用早期绑定并使用类型库来识别guids时。这并不罕见,但这不是你能控制的。如果您知道客户端代码不使用它们,那么只需省略[ProgId]属性,这样就不会发生意外。