扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:IceAir 来源:blog 2007年10月31日
关键字:
IImplInterface = interface(IInterface) function ConvertToUSD(const iNTD: Integer): Double; function ConvertToRMB(const iNTD: Integer): Double; end; |
TImplClass = class(TObject, IImplInterface) private FRefCount: Integer; public function ConvertToUSD(const iNTD: Integer): Double; ... end; implementation function TImplClass.QueryInterface(const IID: TGUID; out Obj): HResult; begin if GetInterface(IID, Obj) then Result := 0 else Result := E_NOINTERFACE; end; function TImplClass._Release: Integer; begin Result := InterlockedDecrement(FRefCount); if Result = 0 then Destroy; end; ... ... |
TIntfServiceClass = class(TObject, IImplInterface) private FImplService: IImplInterface; //FSrvObj: TImplClass; //如果是用类对象委托的话 public Constructor Create; overload; Destructor Destroy; override; Constructor Create(aClass: TClass); overload; property MyService: IImplInterface read FImplService implements IImplInterface; // property MyService: TImplClass read FSrvObj implements IImplInterface; //如果是用对象委托的话。 end; |
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; |
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; |
aPtr := PPointer(Integeer((Pointer(Self))^) + vmtIntfTable)^; |
{$M+} iInvokable = interface(IInterface) {$M-} |
TIntfMetaData = record name: String; //接口名称 UnitName: String; //接口声明的程序单元名称 MDA: TIntfMethEntryArray; //储存接口中方法信息的动态数组 IID: TGUID; //接口的GUID值 Info: PTypeInfo; //描述接口信息的指针 AncInfo: PTypeInfo; //描述父代信息的指针 NumAnc: Integer; //此接口继承自父代接口的方法数目 end; |
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 = record Flags: TParamFlags; Name: String; Info: PTypeInfo; end; TTypeInfo = record Kind: TTypeKind; //数据类型 Name: ShortString; //类型信息的字符串格式 end; |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者