淺析Delphi XE中的動態(tài)Hook某些內(nèi)部事件
Delphi2010之后的RTTI做了很大休整,現(xiàn)在用起來很爽了哦。甚至可以獲取某些類的內(nèi)部私有單元,然后為其賦值!講這個RTTI增強的,可以參考網(wǎng)上的多個博客內(nèi)容,我列舉一下:
Delphi2010RTTI的增強
Delphi的Anymouse方法探秘
萬一的Rtti系列
我這里的主要目的是掛鉤某些內(nèi)部私有事件,然后增加上一些自己的處理過程,這里我以TMenuItem的私有內(nèi)部事件FOnChange作為例程。這個私有事件在菜單內(nèi)部綁定,我們平常狀態(tài)下,在外部無法更改!但是XE之后這個問題不在存在,使用它的全新RTTI,可以很容易的獲得一個類對象的基本上所有的類的字段以及方法和屬性等。
- begin rttiContext := TRttiContext.Create;
- rtype := rttiContext.GetType(TMenuItem);
- rField := rType.GetField('FOnChange');
- if rField <> nil then begin
- V := rField.GetValue(MainMenu1.Items);
- OldMenuItemChangeCode := TValueData(V).FAsMethod.Code;
- OldSelfData := TValuedata(V).FAsMethod.Data;
- TValueData(V).FAsMethod.Code := @TForm1.MenuItemChange;//菜單項目變化
- TValueData(V).FAsMethod.Data := self;
- rField.SetValue(self.MainMenu1.Items,v); end;
上面的代碼就設(shè)置了MainMenu的items的私有事件變量FOnChange的新指向地址為本窗體的實現(xiàn)代碼了,OldMenuItemChangeCode,OldSelfData是保存私有事件的原有方法指針和傳遞的Self指針對象。用來在我們替換后的對象中進(jìn)行調(diào)用,不然原過程就不會被調(diào)用了。然后我們再來看看,新的FonChange的實現(xiàn)過程
- procedure TForm1.MenuItemChange(Sender: TObject; Source: TMenuItem;
- Rebuild: Boolean);
- var
- m: procedure(selfData: TObject;
- Sender: TObject; Source: TMenuItem;
- Rebuild: Boolean);
- begin
- if
- Assigned(OldMenuItemChangeCode) then
- begin
- m := OldMenuItemChangeCode;
- m(OldSelfData,Sender,Source,Rebuild);
- end;
- ShowMessage('菜單修改事件掛鉤');end;
這個代碼中最主要的就是如何來調(diào)用原來的FOnChange的執(zhí)行過程了,熟悉Delphi的人應(yīng)該都知道了Delphi的對象過程中可以使用Self表示當(dāng)前對象,而這個對象在對象過程中的傳遞是通過EAX傳遞的,而此時我們的新過程不是在MainMenu.Items的對象內(nèi)部調(diào)用執(zhí)行的,所以,我們需要顯示的傳遞SelfData作為源對象中的Self對象指針,所以我申明了一個指針過程如下:
- m: procedure(selfData: TObject;Sender: TObject; Source: TMenuItem;
- Rebuild: Boolean);
原文鏈接: http://www.cnblogs.com/DxSoft/archive/2011/01/04/1925907.html
【編輯推薦】
- Delphi與C#之父:技術(shù)理想架構(gòu)開發(fā)傳奇
- Delphi 2010初體驗:徹底告別內(nèi)存泄露
- 開發(fā)熱點周報:Delphi 2010出爐 mixin進(jìn)駐JavaFX
- Anders Hejlsberg將重返Delphi舞臺?
- 9月TIOBE編程語言排行榜發(fā)布 Delphi東山再起