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

通过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

猜你喜欢

转载自www.cnblogs.com/findumars/p/11579250.html