当前位置 : 主页 > 编程语言 > delphi >

Delphi判断某个类是否实现了某个接口

来源:互联网 收集:自由互联 发布时间:2021-06-23
通过TObject.GetInterface可以获得对象的实例实现某个接口,前提条件是必须实例化对象后才能运行GetInterface 下面的方法可获取类是否实现了某个接口,并返回接口的偏移: 1 2 3 4 5 6 7 8 9

通过TObject.GetInterface可以获得对象的实例实现某个接口,前提条件是必须实例化对象后才能运行GetInterface

下面的方法可获取类是否实现了某个接口,并返回接口的偏移:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 function  FindInterface(AClass: TClass; GUID:TGUID;  var  Offset:NativeInt): Boolean ; var    i :  integer ;    InterfaceTable: PInterfaceTable;    InterfaceEntry: PInterfaceEntry; begin    while  Assigned(AClass)  do    begin      InterfaceTable := AClass . GetInterfaceTable;      if  Assigned(InterfaceTable)  then      begin        for  i :=  0  to  InterfaceTable . EntryCount- 1  do        begin          InterfaceEntry := @InterfaceTable . Entries[i];          if  InterfaceEntry . IID=GUID  then          begin            Offset:=InterfaceEntry . IOffset;            Exit( True );          end ;        end ;      end ;      AClass := AClass . ClassParent;    end ; end ;

 下面我们看下通过偏移量的快速获得对象的接口,以及通过接口快速获取对象:

快速获取对象的接口:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 type    TSomeObject= class (TXXX, ISomeInterface)    ......    end ;   var    FItemObjectOffset:NativeInt;   //获取偏移量 FindInterface(TSomeObject, ISomeInterface, FItemObjectOffset)   var    P:TSomeObject;    Intf:ISomeInterface; ....................................   //通过对象直接获取接口      PNativeInt(@Intf)^:=PNativeInt(@P)^+ FItemObjectOffset;      Intf . _AddRef;

  

快速通过接口获取对象

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 type    TSomeObject= class (TXXX, ISomeInterface)    ......    end ;   var    FItemObjectOffset:NativeInt;   //获取偏移量 FindInterface(TSomeObject, ISomeInterface, FItemObjectOffset)   var    P:TSomeObject;    Intf:ISomeInterface; ....................................   //通过接口获取对象    P:=TSomeObject( Pointer (PNativeInt(@Intf)^- FItemObjectOffset));

https://www.cnblogs.com/hezihang/p/5735897.html

网友评论