我在Delphi XE中编写了这段代码,它从GUID const中分配接口的GUID。代码编译好了,但我想知道这是否是一个有效的声明?
const
IID_IFoo: TGUID = '{00000000-6666-6666-6666-666666666666}';
type
IFoo = interface(IDispatch)
[IID_IFoo]
//properties
//methods
end;
答案 0 :(得分:2)
答案 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