Delphi2010之后的RTTI做了很大休整,现在用起来很爽了哦。甚至可以获取某些类的内部私有单元,然后为其赋值!讲这个RTTI增强的,可以参考网上的多个博客内容,我列举一下:

Delphi2010RTTI的增强

Delphi的Anymouse方法探秘

万一的Rtti系列

我这里的主要目的是挂钩某些内部私有事件,然后增加上一些自己的处理过程,这里我以TMenuItem的私有内部事件FOnChange作为例程。 这个私有事件在菜单内部绑定,我们平常状态下,在外部无法更改!但是XE之后这个问题不在存在,使用它的全新RTTI,可以很容易的获得一个类对象的基本 上所有的类的字段以及方法和属性等。

  1. begin
  2. rttiContext := TRttiContext.Create;
  3. rtype := rttiContext.GetType(TMenuItem);
  4. rField := rType.GetField('FOnChange');
  5. if rField <> nil then
  6. begin
  7. V := rField.GetValue(MainMenu1.Items);
  8. OldMenuItemChangeCode := TValueData(V).FAsMethod.Code;
  9. OldSelfData := TValuedata(V).FAsMethod.Data;
  10. TValueData(V).FAsMethod.Code := @TForm1.MenuItemChange;//菜单项目变化
  11. TValueData(V).FAsMethod.Data := self;
  12. rField.SetValue(self.MainMenu1.Items,v);
  13. end;

上面的代码就设置了MainMenu的items的私有事件变量FOnChange的新指向地址为本窗体的实现代码 了,OldMenuItemChangeCode,OldSelfData是保存私有事件的原有方法指针和传递的Self指针对象。用来在我们替换后的对 象中进行调用,不然原过程就不会被调用了。然后我们再来看看,新的FonChange的实现过程

  1. procedure TForm1.MenuItemChange(Sender: TObject; Source: TMenuItem;
  2. Rebuild: Boolean);
  3. var
  4. m: procedure(selfData: TObject;Sender: TObject; Source: TMenuItem;
  5. Rebuild: Boolean);
  6. begin
  7. if Assigned(OldMenuItemChangeCode) then
  8. begin
  9. m := OldMenuItemChangeCode;
  10. m(OldSelfData,Sender,Source,Rebuild);
  11. end;
  12. ShowMessage('菜单修改事件挂钩');
  13. end;

这个代码中最主要的就是如何来调用原来的FOnChange的执行过程了,熟悉Delphi的人应该都知道了Delphi的对象过程中可以使用Self表 示当前对象,而这个对象在对象过程中的传递是通过EAX传递的,而此时我们的新过程不是在MainMenu.Items的对象内部调用执行的,所以,我们 需要显示的传递SelfData作为源对象中的Self对象指针,所以我申明了一个指针过程如下:

m: procedure(selfData: TObject;Sender: TObject; Source: TMenuItem;
  Rebuild: Boolean);

对于本申明过程,如果不是很明白的,请到CnPack的论坛上找本人对该类信息的详细分析过程 。

至此这个,挂钩内部的FonChange过程,就完成了,完整代码

http://blog.csdn.net/suiyunonghen/article/details/6116791

Delphi XE的RTTI增强,动态Hook某些内部事件的更多相关文章

  1. Delphi里的RTTI与反射(举例换掉FOnChange)

    Delphi2010之后的RTTI做了很大休整,现在用起来很爽了哦.甚至可以获取某些类的内部私有单元,然后为其赋值!讲这个RTTI增强的,可以参考网上的多个博客内容,我列举一下:Delphi2010R ...

  2. Delphi下的RTTI函数大全

    http://ljz9425.blog.163.com/blog/static/369148572008111635253858/ Delphi下的RTTI(下) 2008-12-16 15:52:5 ...

  3. delphi 2010与delphi XE破解版的冲突

    在系统中同时安装了Dephi 2010LITE版与Delphi XE lite后,总是会有一个有问题 是因为两者都是读取C:\ProgramData\Embarcadero目录下的license文件, ...

  4. [转载]: delphi中XLSReadWrite控件的使用(2)---delphi XE下安装

    一.下载 官方下载网址: http://www.axolot.com/components/download.htm 从这里可以下载到从Delphi5到DelphiXE全部支持的版本. 二.软件安装 ...

  5. delphi XE Berlin ReadProcessMemory WriteProcessMemory

    delphi  XE,Berlin [dcc32 Error] Unit9.pas(93): E2033 Types of actual and formal var parameters must ...

  6. FastReport for delphi xe 安装步骤

    FastReport for delphi xe 安装步骤 1.先关闭DELPHI:2.下载后解压到一个目录,比如:D:FR:3.打开D:FR,运行recompile.exe ->点击" ...

  7. Delphi XE的firemonkey获取当前文件所在路径的方法

    Delphi XE的firemonkey获取当前文件所在路径的方法 在之前,我们知道有三种方法: ExtractFilePath(ParamStr(0)) ExtractFilePath(Applic ...

  8. Delphi xe 下快捷使用 FastMM 的内存泄露检测功能

    Delphi xe 集成了FastMM,调试程序是的时候可以方便地检查内存泄露了.  使用方法:在project中,添加一行: ReportMemoryLeaksOnShutdown := Debug ...

  9. Delphi XE中使用dbExpress连接MySQL数据库疑难问题解决(对三层的例子配置有帮助)

    Delphi IDE中包含一个Data Explorer的组件,如下图所示: 该组件基于dbExpress(包含TSQLConnection.TSQLDataSet.TSQLQuery.TSQLSto ...

随机推荐

  1. leetcode Trapping Rain Water pthon

    class Solution(object): def trap(self,nums): leftmosthigh = [0 for i in range(len(nums))] leftmax=0 ...

  2. 基于nginx+lua简单的灰度发布系统

    upstream.conf upstream grey_1 { keepalive 1000; server localhost:8020; } upstream grey_2 { keepalive ...

  3. 关于MySQL MyISAM 表并发

    MyISAM的锁调度 MyISAM存储引擎的读锁和写锁是互斥的,读写操作是串行的.那么,一个进程请求某个MyISAM表的读锁,同时另一个进程也请求同一表的写锁,MySQL如何处理呢?答案是写进程先获得 ...

  4. struts2在result中使用el表达式碰到的问题

    <result name="success">/html/portlet/ext/trainingmanagement/download_file.jsp?path=$ ...

  5. Linux网络管理——端口作用

    1. 网络基础 .note-content {font-family: "Helvetica Neue",Arial,"Hiragino Sans GB",&q ...

  6. jQuery中的类型判断

    在JQuery中有一个type方法,在1.11.2中是这样写的 var class2type = {}; var toString = class2type.toString; jQuery.each ...

  7. css书写顺序和常用命名推荐

    写代码的时候有一个好的规范和顺序能够帮你节省很多时间.下文将推荐相关CSS书写顺序和规范的一些方法.这个文档将会整理进前端规范文档中,如果你有更好的意见,不妨留言告知我们. CSS书写顺序 该代码来自 ...

  8. [[转]CSS浮动原理

    CSS Float是网页设计最强大的灵活性功能之一.本文介绍CSS Float的基本原理和行为特征,并介绍各种浏器Float特性的Bugs. 内容 基本的浮动原理 浮动是如何进行的 浮动从何处开始 水 ...

  9. binwalk windows安装和使用方法

    binwalk是一个文件的分析工具,旨在协助研究人员对文件进行分析,提取及逆向工程.简单易用,完全自动化脚本,并通过自定义签名,提取规则和插件模块,还重要一点的是可以轻松地扩展. 以上是binwalk ...

  10. KETTLE使用入门

    一.准备文件 1.安装java虚拟机 2.安装kettle安装文件 二.使用步骤 1.点击Spoon.bat,启动kettle,弹出DOS窗口如下: 2.进入主界面 3.新建资源库