Delphi中methodaddress的代码解析

Delphi程序设计之--经验技巧 这些日子太忙了,今天把剩下的部分贴完,希望对大家有用。看过前一篇的都知道此文的作者和出处,我就不详细说了。{ No. 16 }//对于记录类型Record的分析。实例:type TBaseRec = record   rStr: Integer;   rStr2: String;   rStr3: String; end; TStrRec = record   rStr: Integer;  阅读详情
class function TObject.MethodAddress(const Name: ShortString): Pointer;
asm
        { ->    EAX     Pointer to class        }
        {       EDX     Pointer to name }
        PUSH    EBX
        PUSH    ESI
        PUSH    EDI
        XOR     ECX,ECX           //清零
        XOR     EDI,EDI           //清零
        MOV     BL,[EDX]          //获得字符串的长度
        JMP     @@haveVMT         //判断是否有虚拟方发表
@@outer:                                { upper 16 bits of ECX are 0 !  }
        MOV     EAX,[EAX]
@@haveVMT:
        MOV     ESI,[EAX].vmtMethodTable  //获得虚拟方发表的地址
        TEST    ESI,ESI                   //是否存在
        JE      @@parent                  //如果不存在
        MOV     DI,[ESI]                { EDI := method count           }方法的数量
        ADD     ESI,2                     // 开始 
@@inner:                                { upper 16 bits of ECX are 0 !  }
        MOV     CL,[ESI+6]              { compare length of strings     }  //获得名城的长度
        CMP     CL,BL                                                      //比较长度
        JE      @@cmpChar                                                  //如果相等就开始比较字符
@@cont:                                 { upper 16 bits of ECX are 0 !  }
        MOV     CX,[ESI]                { fetch length of method desc   }  //获得方法的长度  //长度两个字节 指针4个字节  ///
        ADD     ESI,ECX                 { point ESI to next method      }  //指向下一个函数
        DEC     EDI
        JNZ     @@inner
@@parent:                              //获得父的方发表
        MOV     EAX,[EAX].vmtParent     { fetch parent vmt              }
        TEST    EAX,EAX                //是否为0
        JNE     @@outer                //不为零
        JMP     @@exit                  { return NIL                    }  //已经到根

@@notEqual:
        MOV     BL,[EDX]                { restore BL to length of name  } //存储名字的长度
        JMP     @@cont                                                    //转移

@@cmpChar:                              { upper 16 bits of ECX are 0 !  }
        MOV     CH,0                    { upper 24 bits of ECX are 0 !  }  ///清空高位字节
@@cmpCharLoop:
        MOV     BL,[ESI+ECX+6]          { case insensitive string cmp   }  //获得第一个字符
        XOR     BL,[EDX+ECX+0]          { last char is compared first   }  //比较
        AND     BL,$DF                                                     //清空其他标志位 
        JNE     @@notEqual
        DEC     ECX                      { ECX serves as counter         } //比较下一个
        JNZ     @@cmpCharLoop                                              //如果不为零 进行下一个字符的比较

        { found it }
        MOV     EAX,[ESI+2]              //找到 并且得到指针 12 方法长度 3456 方法指针 7890 方法名称 7 方法名城的长度

@@exit:
        POP     EDI
        POP     ESI
        POP     EBX
end;
Delphi 根据字符串找到函数并执行的实例 主要介绍了Delphi 根据字符串找到函数并执行的实例的相关资料,希望通过本能帮助到大家实现这样的功能,需要的朋友可以参考下 立即下载

相关推荐

深入理解Linux 内核追踪机制

Linux 存在众多 tracing tools,比如 ftrace、perf,他们可用于内核的调试、提高内核的可观测性。众多的工具也意味着繁杂的概念,诸如 tracepoint、trace events、kprobe、eBPF 等,甚至让人搞不清楚他们到底是干什么的。本文尝试理清这些概念。

youzhangjing_的博客 1730

Delphi根据方法名调用方法

type   TForm1 = class(TForm)   public   published     procedure DoJsCall(str:string);                                                    //必须声明方法为published     function  DoJsCall2(str:strin

xtfnpgy 3597

恒定跨导的奥秘:基于1:3电流镜的轨到轨运放输入级设计与仿真验证

本文深入探讨了基于1:3电流镜的轨到轨运放输入级设计,重点分析了恒定跨导(GM)的实现原理与仿真验证。通过精确的电流补偿机制和工艺参数优化,解决了传统运放在电源轨附近跨导下降的问题,为模拟集成电路设计提供了可靠的低电压解决方案。

weixin_33686714的博客 516

字符串驱动技术—— MethodAddress , MethodName , ObjectInvoke

Delphi帮助中的介绍(After Delphi 6 ): Returns the address of a published method. class function MethodAddress(const Name: ShortString): Pointer; Description MethodAddress is used internally by the stream

cai5的专栏 1196

Intel AX系列网卡5G热点开启失败?Linux下3种修复方案实测(含Ubuntu/OpenWRT)

本文针对Intel AX系列网卡在Linux系统下无法开启5G热点的常见问题,深入剖析了其根源在于内核LAR机制与驱动的兼容性。文章提供了三种实测有效的修复方案:针对内核低于5.5的模块参数法、适用于高内核版本的hostapd补丁编译法以及高阶的驱动修改法,帮助用户在Ubuntu、OpenWRT等环境中成功启用5G热点功能。

weixin_29291863的博客 734

Android SDK安装教程(超详细),从零基础入门到精通,从这篇开始_android sdk下载安装

Android SDK安装教程(超详细),从零基础入门到精通,从这篇开始_android sdk下载安装

Jinmindong 5015

Delphi中的回调函数

Delphi中的回调函数 回调函数 回调(CallBack)函数就是一种两个对象之间的通知方法。被通知者事先约定好发生某种情况时的处理函数,在该情况发生时发起通知者调用该处理函数以完成回调。举例来说,A是一个函数,B是一个定时器对象,A想在指定时间达到时接收到B的通知,执行步骤如下: //以下为Delphi伪码 TProc = procedure ();//回调函数类型定义,全局函数指针

whsunbin的专栏 1316

【CC精品教程】iTwin capture倾斜摄影建模完整操作流程

【CC精品教程】iTwin capture倾斜摄影建模完整操作流程。包括:无人机航测外业作业流程(像控点布设、航线规划、仿地飞行、航拍)和内业数据处理软件(Pix4d、CC、EPS、PhotoScan、Globalmapper)像控点权重调配、空三加密、DOM、DSM、DEM,DLG生成、等高线生成、高程点提取,点云分类过滤分割、点云生成DEM、三维模型生成等。

智慧空间实验室 3960

delphi 通过字符串获取函数名称(代替判断条件过多的方法)

如果 我们某个方法中有几十个判断,判断的条件是 字符串比较,如何减少判断,直接定位到与 字符串相同的方法去执行? 下列方法 应该可行 MethodAddress:取得方法的地址,这个方法需要是published的。 实例代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ..

全粘工程师 723

微信小程序启用蓝牙设备特征值变化时的notify功能

注意:这里的serviceUUID、notifyCharacteristicUUID 我会在后面写入数据时做重点说明。isNotifyBLECharacteristic:false, //是否启用蓝牙设备服务特征 notify。二、启用蓝牙设备特征值变化时的notify功能。下一篇 将继续介绍 微信小程序蓝牙设备写入数据。

wsk198726的专栏 1173

【嘉立创EDA】PCB金属包边设计快捷方法

本文使用嘉立创EDA,描述如何在PCB设计时,快速增加边框包边设计,特别是金属包边(伪)——这里标记(伪)是因为该这里的包边特指不含边缘壁。请参考本文时特别注意!本文将此过程记录,以供有需要的读者参考。

l64481000的博客 1744

[转]李战大师-悟透delphi-第一章 delphi的原子世界

====================================================== 注:本文源代码点此下载 ====================================================== yjmyzz:李战大师的成名,并不是因为08年发表于园子里的那篇"悟透javascript",而是多年前的这篇处女作"悟透delphi",原出处已

javazhuanzai的专栏 7914

MTK 平台功耗优化策略全解析:Clock 管控、GPU 同步与 Preview 降帧实战方案

在中高端移动终端影像系统中,Camera 模块已成为功耗的关键来源之一,尤其是在高帧率拍摄、AI 模式实时预览等场景下,ISP、Sensor、GPU 与 SoC 时钟频率的大幅提升极易引发系统发热与续航瓶颈。MTK 平台基于多级功耗控制机制,构建了包括 Clock Gate 管理、GPU 时序协同、预览流降帧、Pipeline 低功耗切换等在内的影像功耗优化策略。本文聚焦于 MTK Camera 系统中的核心功耗控制点,基于实际项目部署案例,系统拆解其在不同模式下的节能路径设计与调试方法,为终端厂商与影像系

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 2528

【转】Delphi类和组件-Delphi的原子世界

[摘要]本文介绍Delphi类和组件的相关知识,包括:System、TObject、TClass、对象的消息处理机制等。 “天苍苍,野茫茫,风吹草低见牛羊”在使用 DELPHI 开发应用软件的过程中,我们就像草原上一群快乐牛羊,无忧无虑地享受着 Object Pascal 语言为我们带来的温暖阳光和各种 VCL 控件提供的丰富水草。抬头望望无边无际蔚蓝的天空,低头品尝大地上茂密的青草,谁会去...

weixin_30457465的博客 177

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

问题-MethodAddress返回NIL?MethodAddress与published的关系?

问题现象:有位朋友(397085381)在Q群里问“为什么书上的可以访问,而自己写的代码访问时为nil” 问题原因:因为要用“Self.MethodAddress('Test')”访问,方法必须放在“published”下。 问题处理:增加“published”就好了。 解答人员:541011510、316405484、397085381。   实例代码: 1 unit Un...

weixin_34055910的博客 190

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Delphi中关于Rtti的一些操作(一)

function TForm1.ShowMethodAddress(aObj: TDerived; const sData: String) : Pointer; var   aPtr : Pointer;   sResult : String; begin   try     aPtr := aObj.MethodAddress(sData);     sResult := For

diligentcat的专栏 978

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

访问祖先类的虚方法

访问祖先类的虚方法问题提出       在子类覆盖的虚方法中,可以用inherited调用父类的实现,但有时候我们并不需要父类的实现,而是想跃过父类直接调用祖先类的方法。举个例子,假设有三个类,实现如下:type  TClassA = class    procedure Proc; virtual;  end;   TClassB = class(TCla

colin 2838

Delphi文件管理

         文件是同一类型元素的有序集合,是内存与外设间传输数据的渠道。一些外设如显示器、键盘、打印机等都可以看作文件,但最常用的还是磁盘文件,这也是本章我们主要讨论的对象。         Delphi继承了Object Pascal的文件管理功能,并有很大的发展,其中最主要的是提供了用于文件管理的标准控件,同时也提供了更多的文件管理函数。利用Delphi的强大功能,开发一个自己的文件

HzqGhost's Blog 1753

Delphi按名字调用方法

按名字调用方法似乎一直以来都是大家比较关注的技术,在论坛上有一个经典的答复:  type    TProcedure = procedure(Test: string) of object;  procedure ExecuteRoutine(Obj: TObject; Name, Param: string);  var    PMethod: TMethod;    AProcedur

QinXiongWei的专栏 1322

delphi 函数指针 方法指针

unit Unit1;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TEvent = procedure () of object; TProc = procedure(); TForm1 =...

weixin_30500289的博客 179

在Delphi中动态调用事件方法

最近用到了一个稍微高级一点儿的内容,就是在代码中动态调用事件方法,或者说是函数指针,由于Delphi的特殊性,所以,直接上代码吧: procedure TForm1.Button2Click(Sender: TObject); var f, f1: TNotifyEvent; d: NativeUInt; pm, pm1: ^TMethod; begin New(pm); try f := Button1Click; pm.Code := TMethod(f).Co

Component㊣的博客 1329

Delphi中的匿名方法

在js的世界里,基本就是大量的“回调”和“异步”函数,剩下的就是按照顺序执行的javascript代码,所以总的来说,js中无“同步模型”。正是因为如此,javascript在运行时没有“多余的”线程,它们都在同一个“线程”中工作。任何第三方平台,凡是其API-Proxy代理服务器向你“代理转发(重定向)URL”,其响应结果,要么你在浏览器的导航器的地址栏中去取(Navigator.Location),要么你在响应头的redirect参数中去取,它们,都是异步的。Delphi及C++ Builder中,可以

pulledup的博客 1825

Delphi 知识 彻底搞懂Delphi中的匿名方法

详细介绍Delphi 的匿名方法定义、使用、优点等

sensor_WU 博客 2404

DELPHI 通过方法名执行方法

通过方法名称,调用方法,并传参数!

猪猪侠的点滴 862

Delphi的TValue探索(一)

TValue是Delphi的RTTI系统的重要类型。 经过摸索,发现TValue功能强大,可以实现很多功能。本文章中所有程序采用XE3运行通过。 一、TValue结构 TValue定义在System.Rtti.pas TValue = record ... private FData: TValueData end; TValue提供了一些系列方法,几乎都是操作F...

weixin_30394333的博客 530

20.Delphi对象式数据管理功能

====================================================== 注:本文源代码点此下载 ====================================================== 面向对象技术是九十年代的主流技术,各类应用软件如果以面向对象的方法构造并且渗透面向对象的风格将使软件具有更高的品质。在面向对象程序设计中,对象式数

javazhuanzai的专栏 592
上一篇: c++中对目录的操作示例
下一篇: delphi程序设计之底层原理
一剑平江湖
博客等级 码龄18年 207粉丝 1070原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值