日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺析DelphiXE中的動(dòng)態(tài)Hook某些內(nèi)部事件

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ì)象的基本上所有的類的字段以及方法和屬性等。

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

上面的代碼就設(shè)置了MainMenu的items的私有事件變量FOnChange的新指向地址為本窗體的實(shí)現(xiàn)代碼了,OldMenuItemChangeCode,OldSelfData是保存私有事件的原有方法指針和傳遞的Self指針對(duì)象。用來在我們替換后的對(duì)象中進(jìn)行調(diào)用,不然原過程就不會(huì)被調(diào)用了。然后我們?cè)賮砜纯?,新的FonChange的實(shí)現(xiàn)過程

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

這個(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è)指針過程如下:

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

網(wǎng)頁題目:淺析DelphiXE中的動(dòng)態(tài)Hook某些內(nèi)部事件
網(wǎng)站路徑:http://www.5511xx.com/article/coghcsj.html