【问题标题】:Question about assigning GUID to interface关于将 GUID 分配给接口的问题
【发布时间】:2011-10-05 18:57:38
【问题描述】:

我在 Delphi XE 中编写了这段代码,它从 GUID const 分配接口的 GUID。代码编译正常,但我想知道这是否是一个有效的声明?

const
  IID_IFoo: TGUID = '{00000000-6666-6666-6666-666666666666}';
type
  IFoo = interface(IDispatch)
    [IID_IFoo]
    //properties
    //methods
  end;

【问题讨论】:

    标签: delphi interface delphi-xe


    【解决方案1】:

    可以这样做,但问题是你为什么要这样做?

    如果您希望引用接口的 GUID 而不是接口的名称,那么只要该接口具有关联的 IID (GUID),那么您就可以在需要 TGUID 的地方使用接口名称:

    type
      IFoo = interface(IDispatch)
        ['{00000000-6666-6666-6666-666666666666}']
        //properties
        //methods
      end;
    
    // meanwhile, elsewhere in the project...
    
      sFooIID := GUIDToString(IFoo);
    

    这是一个不那么“嘈杂”的接口声明,并避免了您可能声明/引用一个 IID 常量的可能性,该常量实际上与您认为的接口无关(或尚未与该接口相关联) IID)。

    const
      IID_Foo = '{00000000-6666-6666-6666-666666666666}';
      IID_Bar = '{00000000-6666-6666-6666-777777777777}';
    
    type
      IFoo = interface(IDispatch)
        [IID_Bar]    // WHOOPS!
        :
      end;
    
      IBar = interface(IDispatch)
        // WHOOPS again!!
        :
      end;
    
    
    // Meanwhile, elsewhere in the project
    
    sBarID := GUIDToString(IID_Bar);   // Works, but is the IID of IFoo, not IBar
    sFooID := GUIDToString(IID_Foo);   // Works, but is an IID not associated with any interface
    

    将接口本身用作接口 IID,而不是使用单独的 const 声明,消除了这些错误的可能性。

    当为 IID 使用单独的常量声明时 - 如果您绝对需要 - 您可以通过在预期 IID 的情况下使用接口来避免这些问题之一。但这可以说在错误的 IID 用于特定接口的情况下会使事情变得更糟:

    // Cannot make the mistake of using an interface as a GUID if it has no IID at all
    
    sBarID := GUIDToString(IBar);   // Does not compile - IBar has no IID
    
    
    // But if it's the wrong IID then you get results that are "correct" but not expected:
    
    a := GUIDToString(IFoo);
    b := GUIDToString(IID_Foo);
    
      a <> b
    

    【讨论】:

    • 我看不出你造成的危险如此严重,但我确实认为将 IID 内联作为文字更符合习惯。
    • 最常见的是你看不到的危险。 ;)(但是,是的,可能比真正的高风险更罕见的情况危险——即便如此,为什么在不需要时引入这些危险的可能性?)
    • @Deltics 声明 GUID 常量与接口分离的一个原因是作为 Delphi 的一种解决方法,它不允许您声明接口类型的常量。见this Q&A
    • @Craig - 是的,但也需要有理由/需要声明这样的 const。该问答首先假设需要一组 TGUID,而无需确定需要。没有信息可以识别这样的阵列旨在解决的问题。如果没有这个原始问题,即使在这种情况下也需要一个 GUID 常量还有待确定,因为这只是 OP 从一开始就想要的。
    【解决方案2】:

    是的,这很好。如果您想知道为什么应该在接口中使用 guid,请查看This

    编辑

    您可以确保它有效。只需使用 guid 使用 QueryInterface,您就会看到它的工作原理

    【讨论】:

    • 谢谢@Rafael,我真的知道为什么我必须在接口中使用 GUID,我只是关心声明。
    猜你喜欢
    • 1970-01-01
    • 2020-01-25
    • 2010-09-19
    • 1970-01-01
    • 2021-08-18
    • 2011-03-06
    • 1970-01-01
    • 2016-06-28
    • 2020-08-18
    相关资源
    最近更新 更多