Delphi判断某个类是否实现了某个接口
通过TObject.GetInterface可以获得对象的实例实现某个接口,前提条件是必须实例化对象后才能运行GetInterface
下面的方法可获取类是否实现了某个接口,并返回接口的偏移:
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;
下面我们看下通过偏移量的快速获得对象的接口,以及通过接口快速获取对象:
快速获取对象的接口:
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;
快速通过接口获取对象
type
TSomeObject=class(TXXX, ISomeInterface)
......
end; var
FItemObjectOffset:NativeInt; //获取偏移量
FindInterface(TSomeObject, ISomeInterface, FItemObjectOffset) var
P:TSomeObject;
Intf:ISomeInterface;
.................................... //通过接口获取对象
P:=TSomeObject(Pointer(PNativeInt(@Intf)^- FItemObjectOffset));
Delphi判断某个类是否实现了某个接口的更多相关文章
- 在C#中判断某个类是否实现了某个接口
有时我们需要判断某个类是否实现了某个接口(Interface),比如在使用反射机制(Reflection)来查找特定类型的时候. 简单来说,可以使用Type.IsAssignableFrom方法: t ...
- 【.Net】在C#中判断某个类是否实现了某个接口
有时我们需要判断某个类是否实现了某个接口(Interface),比如在使用反射机制(Reflection)来查找特定类型的时候. 简单来说,可以使用Type.IsAssignableFrom方法: t ...
- Delphi中线程类TThread实现多线程编程1---构造、析构……
参考:http://www.cnblogs.com/rogee/archive/2010/09/20/1832053.html Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大 ...
- 转发 Delphi中线程类TThread 实现多线程编程
Delphi中有一个线程类TThread是用来实现多线程编程的,这个绝大多数Delphi书藉都有说到,但基本上都是对TThread类的几个成员作一简单介绍,再说明一下Execute的实现和Synchr ...
- 转:学习笔记: Delphi之线程类TThread
学习笔记: Delphi之线程类TThread - 5207 - 博客园http://www.cnblogs.com/5207/p/4426074.html 新的公司接手的第一份工作就是一个多线程计算 ...
- 学习笔记: Delphi之线程类TThread
新的公司接手的第一份工作就是一个多线程计算的小系统.也幸亏最近对线程有了一些学习,这次一接手就起到了作用.但是在实际的开发过程中还是发现了许多的问题,比如挂起与终止的概念都没有弄明白,导致浪费许多的时 ...
- C#与Java对比学习:类型判断、类与接口继承、代码规范与编码习惯、常量定义
类型判断符号: C#:object a; if(a is int) { } 用 is 符号判断 Java:object a; if(a instanceof Integer) { } 用 inst ...
- 谈谈Delphi中的类和对象3---抽象类和它的实例
四.抽象类和它的实例 Delphi中有一个类称为是抽象类,你不能天真的直接为它创建一个实例,如 var StrLst: TString; begin StrLst:= TString.Create; ...
- Delphi中TStringList类常用属性方法详解
TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...
随机推荐
- MVC框架以及实例
MVC框架 MVC(model,view,controller),一种将业务逻辑.数据.界面分离的方法组织代码的框架.在改进界面及用户交互的同时,不需要重写业务逻辑.MVC将传统的输入.处理和输出分离 ...
- 从golang-gin-realworld-example-app项目学写httpapi (四)
https://github.com/gothinkster/golang-gin-realworld-example-app/blob/master/users/routers.go 路由定义 pa ...
- 使用公钥和私钥实现LINUX下免密登录
linux公钥私钥实现无密码登录 首先本地主机生成公约和私钥 # ssh-keygen /生成公钥和私钥 不要更改默认路径,中途不要输入密码,直接两次回车. 2. 将生成 ...
- [翻译] TWRPickerSlider
TWRPickerSlider https://github.com/chasseurmic/TWRPickerSlider Usage Add the dependency to your Podf ...
- MongoDB命令及其MongoTemplate的混合讲解
前言 前面讲解了如何在springboot中集成mongodb,本文将讲解mongodb命令操作及其MongoTemplate的使用.穿插的目的在于不用先去寻找mongodb的命令又去寻找在java中 ...
- Gdb调试工具/ Makfile项目管理
gdb调试工具 gcc -g main.c -o main 常用命令 命令 简写 作用 help h 按模块列 ...
- 使用 Nginx 对 ASP.NETCore网站 或 Docker 等进行反向代理,宝塔面板对 ASP.NET Core 反向代理
1,Nginx 的 配置文件 Nginx 可以配置反向代理.负载均匀等, 其默认配置文件名为 nginx.conf . 一般存放于 /你的安装目录/nginx/conf 下 Nginx 加载配置信息 ...
- ASP.NET Core 添加静态目录访问、使其它目录可被访问
使用app.UseFileServer 在 public void Configure(){}中,修改或添加 app.UseFileServer(new FileServerOptions() { F ...
- Vim 编辑器及其基本操作
实验楼某些课程有用 Vim 编辑器来写代码,因此有了这篇博客,据说是上古神器,当然主要目的是基本操作. Vim 编辑器 Vim(Vi IMprove) 是 Linux 系统上的最著名的文本/代码编辑器 ...
- 中间人攻击利用框架bettercap测试
0x00前言 上篇提到内网渗透很有趣,这次就从一款新工具说起: bettercap 0x01简介 bettercap可用来实现各种中间人攻击,模块化,便携.易扩展 0x02特点 提到中间人攻击,最知名 ...