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

functionFindInterface(AClass: TClass; GUID:TGUID;varOffset:NativeInt):Boolean;

var

i :integer;

InterfaceTable: PInterfaceTable;

InterfaceEntry: PInterfaceEntry;

begin

whileAssigned(AClass)do

begin

InterfaceTable := AClass.GetInterfaceTable;

ifAssigned(InterfaceTable)then

begin

fori :=0toInterfaceTable.EntryCount-1do

begin

InterfaceEntry := @InterfaceTable.Entries[i];

ifInterfaceEntry.Idelphi keyword">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