4

认为:

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

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

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

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

3b)我收购了 HelpfulUserAtSO 的公司,并希望将他的代码(包含接口定义)集成到我的(包含副本。假设没有范围冲突)。
后果是什么?

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

4

2 回答 2

3

如果不在同一个进程中使用相同的 GUID,则定义相同的 GUID 是安全的。但是,例如,如果您通过 COM 访问它们,那肯定会令人困惑。

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

IMT接口表

查看这篇非常完整的文章,了解有关接口如何工作的详细信息,以及这个内部 IMT 查找表是什么。相同的 GUID 将意味着相同的 IMT 表,但对您而言并非如此,因此它只会在运行时中断。

于 2013-08-09T10:24:31.550 回答
0

由于对从另一个复制的新界面使用重复的 GUID,刚刚遇到错误。

结果是,由于我使用Supports,虽然我打算调用InterfaceB.Method,但是InterfaceA.Method1即使它具有不同的方法签名,也被错误地调用了……我在 IDE 调试器中发现了这一点。

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

于 2021-11-27T13:52:52.837 回答