我的接口没有GUID也能运行(20分)

  • 主题发起人 主题发起人 WTO_LOVER
  • 开始时间 开始时间
W

WTO_LOVER

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个接口,同时在类中继承实现,忘记加入GUID 但是他没有问题,这何解,
还有一个问题,COM接口是不是与普通的接口是两个概念,COM的方法不但定义而且还
实现了,我现在都快风了,什么叫接口,不会是KISS吧;老兄帮我一把,。。。
 
该不是在一个工程中吧?
 
Delphi(特别是6)中对接口进行了扩展,不再仅仅是兼容COM那套,
但实际使用中,绝大多数的接口操作函数,如Support等都需要
GUID才能使用,例如
type
INoGuid = interface
['{D722C064-43DE-4F1C-9A05-B8B6722D9788}']
procedure Hello;
end;

IOther = interface
['{9D49D575-03B5-485C-8B55-8989C01BAF5B}']
end;

TNoGuid = class(TInterfacedObject, INoGuid, IOther)
public
procedure Hello;
end;

{ TNoGuid }

procedure TNoGuid.Hello;
begin
ShowMessage('Hello World!');
end;

procedure TForm1.Button5Click(Sender: TObject);
var
spNoGuid: INoGuid;
spOther: IOther;
begin
spNoGuid := TNoGuid.Create
// INoGuid无需IID
spNoGuid.Hello;

spOther := TNoGuid.Create
// IOther无需IID

spNoGuid := spOther as INoGuid
// IOther无需IID, INoGuid需要IID
spNoGuid.Hello;
end;
直接使用接口INoGuid时,你不定义INoGuid的IID也是可以的,
但如果你使用一些接口的维护函数,如as关键字、Support函数等等
这是你的IID就必须定义,如spNoGuid := spOther as INoGuid;
一行,如果你没有定义INoGuid的IID则无法编译通过,因为as实际上
使用了_IntfCast函数,而此函数
procedure _IntfCast(var Dest: IInterface
const Source: IInterface
const IID: TGUID);
的参数必须传入IID才行,support等函数类似。
而在这一行你不定义IOther的IID就没有问题,因为你没有使用到
IOther的IID,Delphi在编译时会自动进行检查。
 
你肯定是在一个项目里用的吧,你这样就是直接调用接口了,不用到注册表里查你的接口
在哪里
 
后退
顶部