天天看点

Delphi XE的RTTI增强,动态Hook某些内部事件

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

<a href="http://blog.csdn.net/wr960204/archive/2009/09/23/4584503.aspx">Delphi2010RTTI的增强</a>

<a href="http://blog.csdn.net/wr960204/archive/2010/03/19/5395774.aspx">Delphi的Anymouse方法探秘</a>

<a href="http://www.cnblogs.com/del/archive/2009/10/15/1583969.html?login=1">万一的Rtti系列</a>

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

代码

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

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

m: procedure(selfData: TObject;Sender: TObject; Source: TMenuItem;

  Rebuild: Boolean);

<a href="http://files.cnblogs.com/DxSoft/RTTi%E5%8A%A8%E6%80%81Hook%E6%9F%90%E4%BA%9B%E5%86%85%E9%83%A8%E4%BA%8B%E4%BB%B6.rar">至此这个,挂钩内部的FonChange过程,就完成了,完整代码</a>

本文转自 不得闲 博客园博客,原文链接:   vhttp://www.cnblogs.com/DxSoft/archive/2011/01/04/1925907.html,如需转载请自行联系原作者

继续阅读