关于为接口分配GUID的问题

时间:2011-07-14 23:52:36

标签: delphi interface delphi-xe

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

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

2 个答案:

答案 0 :(得分:2)

是的,这很完美。如果您想知道为什么要在接口中使用guid,请检查This

修改

您可以确保它有效。只需使用guid使用QueryInterface,您就会看到它的内容

答案 1 :(得分:2)

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

如果您希望引用接口的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常量实际上与你认为的接口无关(或者与之没有关联的接口)完全是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