程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 基於Delphi的接口編程入門(4)

基於Delphi的接口編程入門(4)

編輯:Delphi

實現如下:

constructor TIntfServiceClass.Create;
begin
 FImplService := TImplClass.Create;
end;
constructor TIntfServiceclass.Create(aClass: TClass);
var
 instance: TImplClass;
begin
 instance := TImplClass(aClass.NewInstance);
 FImplService := instance.Create;
end;
destructor TIntfServiceClass.Destroy;
begin
 FImplService := nil; //遵照TImplClass使用引用計數來控制對象生命周期,看TImplClass的Destroy實現。
 inherited;
end;

6、接口和RTTI

Delphi中在VMT-72位移處定義了接口哥格指針:vmtIntfTable = -72。

相關函數:

GetInterfaceCount; //獲取接口數量。
GetInterfaceTable; //獲取接口表格。

相關結構:

TInterfaceEntry = packed record
IID: TGUID;
VTable: Pointer;
IOffset: Integer;
ImplGetter: Integer;
end;
PInterfaceTable = ^TInterfaceTable;
TInterfaceTable = packed record
EntryCount: Integer;
EntrIEs: array[0..9999] of TInterfaceEntry;
end;

Self是指向VMT指針的指針,所以:Self.GetInterfaceTable.EntryCount等價於:

aPtr := PPointer(Integeer((Pointer(Self))^) + vmtIntfTable)^;

只要在聲明中使用M+/M-指令就能在Delphi中編譯出的程序裡添加RTTI信息,如:

{$M+}
iInvokable = interface(IInterface)
{$M-}

接口的RTTI信息由TIntfMetaData記錄結構定義:

TIntfMetaData = record
name: String; //接口名稱
UnitName: String; //接口聲明的程序單元名稱
MDA: TIntfMethEntryArray; //儲存接口中方法信息的動態數組
IID: TGUID; //接口的GUID值
Info: PTypeInfo; //描述接口信息的指針
AncInfo: PTypeInfo; //描述父代信息的指針
NumAnc: Integer; //此接口繼承自父代接口的方法數目
end;

TIntfMethEntryArray的定義如下:

type
 TCallConv = (ccReg, ccCdecl, ccPascal, ccStdCall, ccSafeCall);
 TIntfMethEntry = record
 Name: String; //方法名稱
 CC: TCallConv; //調用慣例
 Pos: Integer; //方法在接口中的位置
 ParamCount: Integer; //方法的參數數目
 ResultInfo: PTypeInfo; //描述方法回傳類型的信息指針
 SelfInfo: PTypeInfo; //描述方法本身的信息指針
 Params: TIntfParamEntryArray; //描述參數信息的動態數組
 HasRTTI: Boolean; //這個方法是否擁有RTTI信息的布爾值
end;
TIntfMethEntryArray = array of TIntfMethEntry;

參數信息TIntfParamEntry定義:

TIntfParamEntry = record
Flags: TParamFlags;
Name: String;
Info: PTypeInfo;
end;
TTypeInfo = record
Kind: TTypeKind; //數據類型
Name: ShortString; //類型信息的字符串格式
end;

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved