新聞中心
Delphi2010之后的RTTI做了很大休整,現(xiàn)在用起來很爽了哦。甚至可以獲取某些類的內(nèi)部私有單元,然后為其賦值!講這個(gè)RTTI增強(qiáng)的,可以參考網(wǎng)上的多個(gè)博客內(nèi)容,我列舉一下:

Delphi2010RTTI的增強(qiáng)
Delphi的Anymouse方法探秘
萬一的Rtti系列
我這里的主要目的是掛鉤某些內(nèi)部私有事件,然后增加上一些自己的處理過程,這里我以TMenuItem的私有內(nèi)部事件FOnChange作為例程。這個(gè)私有事件在菜單內(nèi)部綁定,我們平常狀態(tài)下,在外部無法更改!但是XE之后這個(gè)問題不在存在,使用它的全新RTTI,可以很容易的獲得一個(gè)類對(duì)象的基本上所有的類的字段以及方法和屬性等。
- 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;//菜單項(xiàng)目變化
- TValueData(V).FAsMethod.Data := self;
- rField.SetValue(self.MainMenu1.Items,v); end;
上面的代碼就設(shè)置了MainMenu的items的私有事件變量FOnChange的新指向地址為本窗體的實(shí)現(xiàn)代碼了,OldMenuItemChangeCode,OldSelfData是保存私有事件的原有方法指針和傳遞的Self指針對(duì)象。用來在我們替換后的對(duì)象中進(jìn)行調(diào)用,不然原過程就不會(huì)被調(diào)用了。然后我們?cè)賮砜纯?,新的FonChange的實(shí)現(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;
這個(gè)代碼中最主要的就是如何來調(diào)用原來的FOnChange的執(zhí)行過程了,熟悉Delphi的人應(yīng)該都知道了Delphi的對(duì)象過程中可以使用Self表示當(dāng)前對(duì)象,而這個(gè)對(duì)象在對(duì)象過程中的傳遞是通過EAX傳遞的,而此時(shí)我們的新過程不是在MainMenu.Items的對(duì)象內(nèi)部調(diào)用執(zhí)行的,所以,我們需要顯示的傳遞SelfData作為源對(duì)象中的Self對(duì)象指針,所以我申明了一個(gè)指針過程如下:
- m: procedure(selfData: TObject;Sender: TObject; Source: TMenuItem;
- Rebuild: Boolean);
網(wǎng)頁題目:淺析DelphiXE中的動(dòng)態(tài)Hook某些內(nèi)部事件
網(wǎng)站路徑:http://www.5511xx.com/article/coghcsj.html


咨詢
建站咨詢
