在接口定义中使用相同GUID的危险?

时间:2013-08-09 08:47:21

标签: delphi interface guid

假设:

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

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

2)我认为很棒的答案!并盲目地将其复制到我的生产代码中。

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

3b)我买了有用的UsserAtSO的公司,想要将他的代码(包含接口定义)整合到我的(包含副本。假设没有范围冲突)。
有什么后果?

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

1 个答案:

答案 0 :(得分:3)

如果不在同一进程中使用相同的GUID,则可以安全地定义相同的GUID。但是,如果,例如你通过COM访问它们,它肯定会让人感到困惑。

如果在同一进程中使用具有相同GUID的不同接口,例如通过共享Delphi代码单元,您可能肯定会遇到问题。按照惯例,唯一的GUID应该定义一个唯一的签名(即方法集),因此代码可能认为给定的类实例实现了接口的所有方法,而事实并非如此。因此,内部执行查找表(IMT)将不匹配。调用方法时会得到很多A / V.

IMT interface table

请查看at this very complete article,了解有关接口如何工作的详细信息,以及此内部IMT查找表的内容。相同的GUID意味着相同的IMT表,对于您来说情况并非如此,因此它将在运行时中断。