关于基于Delphi平台的接口编程入门.docx
关于基于Delphi平台的接口编程入门
举个例子好了:有这样一个卖票效劳,电*可以卖票,歌剧院可以卖票,客运站也可以卖票,那么我们是否需要把电*、、歌剧院和客运站都设计成一个类架构以供应卖票效劳?要知道,连经理人都可以卖票,很明显不适合把经理人也包括到卖票效劳的继承架构中,我们需要的只是一个共通的卖票效劳。于是,卖票的效劳是个接口,电*、歌剧院什么的只要都遵循这样一个效劳定义就能很好地相互交互和沟通(假如必要的话)。
如何在Delphi中使用接口
1、声明接口
IMyInterface=interface(IInterface)//说明(1)
[”{63E072DF-B81E-4734-B3CB-3C23C7FDA8EA}”]//说明(2)
functionGetName(conststr:String):String;stdcall;
functionQueryInterface(constIID:TGUID;outObj):HResult;stdcall;//说明(3)
function_AddRef:Integer;stdcall;//使接口引用数加1。
function_Release:Integer;stdcall;//使接口引用数减1,当小于等于0时作释放动作。
end;
说明(1):假如有连续关系则在括号里填父接口,否则省却,如:IMyInterface=interface这样就行。
说明(2):此GUID可选,假如要实现具有COM特性的接口的话则需要加上,Delphi中对于有GUID的接口在运行时在VMT表的预定位置生成接口的信息,如接口方法的定义、方法参数定义能具体信息。
说明(3):接口必需实现这三个函数。
2、接口的实现
接口效劳是由类来实现的。
TIntfClass=class(TObject,IMyInterface)
private
FCounter:Integer;
FRefCount:Integer;
public
functionQueryInterface(constIID:TGUID;outObj):HResult;stdcall;
...
end;
3、猎取接口
a.使用类型转换。如:
varaIntf:IMyInterface;
begin
aObj:=TIntfClass.Create;
try
aIntf:=(IMyInterface(aObj);
...
b.利用Delphi编译器内建机制。如:aIntf:=aObj。
c.利用对象的QueryInterface方法。如OleCheck(aObj.QueryInterface(IID,aIntf));只能存取有GUID的COM接口。
d.利用as操作符。
使用as操作符必需符合下面条件:
1.接口必需明确地指定是从IInterface接口继承下来。
2.必需拥有GUID值
在Delphi7中接口的实现类还必需是从TInterfacedObject继承下来才行,如:
TIntfClass=class(TInterfacedObject,IMyInterface)
4、接口和对象生命期
由于Delphi会自行检查接口假如在使用后没有释放而在生成的程序里加上释放代码,但也因这样带来了问题,如下面代码:
var
i:Integer;
aObj:TIntfClass;
aIntf:IMyInterface;
begin
aObj:=TIntfclass.Create;
try
aIntf:=aObj;
aIntf.GetName...
finally
aIntf:=nil;
FreeAndNil(aObj);
end;
上面的代码执行的话会产生存取违规错误,是由于对接口置nil时已释放接口,而FreeAndNil(aObj)会再释放aIntf一次,而在对aIntf置
nil时已释放了该对象。解决这个