在接口定义中使用相同的GUID的危险性是什么?

4

假设:

1)HelpfulUserAtSO使用从其生产代码中复制的片段回答了我的SO问题:

type
  IReqBase = Interface(IInterface)
  ['{B71BD1C3-CE4C-438A-8090-DA6AACF0B3C4}']
    procedure FillWithTemplateData;
  end;

2) 我认为这是一个很好的答案!并将其盲目复制到我的生产代码中。

3a) 我们两个都分发我们的应用程序,用户X想要在他的计算机上安装两个可执行文件。会有什么后果?

3b) 我购买了 HelpfulUserAtSO 的公司,并想将他的代码(包含接口定义)集成到我的代码中(包含副本。假设没有作用域冲突)。会有什么后果?

毕竟 GUID 应该是“全球唯一”的...


错误出在你复制 GUID 的地方。虽然有很多情况下你必须这样做,但至少有同样多的情况下你应该创建自己的 GUID。这与外部代码并没有特别关联,也适用于您在同一应用程序或不同应用程序中编写的代码。 - Uwe Raabe
3
顺便提一下:Delphi编译器(或IDE)在项目中发现GUID不唯一时应发出警告,例如由于复制和粘贴操作导致的情况-请参见有检测重复接口GUID的工具吗? - mjn
1
有时候,在同一个项目中可能会定义相同的GUID,例如如果同一个COM对象被多次引用。在发出警告之前,应该检查所有方法的接口签名...这并不容易...但确实是可能的... - Arnaud Bouchez
2个回答

3

如果在不同的进程中使用相同的GUID是安全的,这意味着你可以定义相同的GUID。但是,如果你通过COM访问它们,会导致混淆。

如果在同一个进程中使用相同的GUID和不同的接口(例如通过共享Delphi代码单元),可能会遇到问题。按照惯例,唯一的GUID应该定义唯一的签名(即方法集合),所以代码可能会认为给定的类实例实现了接口的所有方法,但实际情况并非如此。因此,内部执行查找表(IMT)将无法匹配。调用方法时会出现大量A/V错误。

IMT interface table

请参阅这篇非常详细的文章,了解接口的工作原理以及内部IMT查找表是什么。相同的GUID意味着相同的IMT表,在你这里不会发生,因此会在运行时出现错误。


0

刚刚因为新接口复制了另一个接口的 GUID 导致出现错误。

后果是,由于我使用了 Supports,尽管我本来想调用 InterfaceB.Method,但错误地调用了 InterfaceA.Method1,即使它具有不同的方法签名……我在 IDE 调试器中发现了这一点。

编译器应该将重复的接口 GUID 报告为错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接