天天看點

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,如需轉載請自行聯系原作者

繼續閱讀