3、獲取接口
a. 使用類型轉換。 如:
var aIntf: 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時已釋放了該對象。解決這個問題只要不讓接口干擾對象的生命期就可以了,在Release中只需減引用計數而不做釋放的動作。
function TIntfClass._Release: Integer;
begin
Result := InterlockedDecrement(FRefCount);
end;