自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

淺析Delphi XE中的動態(tài)Hook某些內(nèi)部事件

開發(fā) 開發(fā)工具
今天我們講到的是Delphi XE中的RTTI增強,動態(tài)Hook某些內(nèi)部事件。雖然Delphi有些遠(yuǎn)離程序員的視線,但是我們應(yīng)該重視這個曾經(jīng)的霸主。

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,可以很容易的獲得一個類對象的基本上所有的類的字段以及方法和屬性等。

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

上面的代碼就設(shè)置了MainMenu的items的私有事件變量FOnChange的新指向地址為本窗體的實現(xiàn)代碼了,OldMenuItemChangeCode,OldSelfData是保存私有事件的原有方法指針和傳遞的Self指針對象。用來在我們替換后的對象中進(jìn)行調(diào)用,不然原過程就不會被調(diào)用了。然后我們再來看看,新的FonChange的實現(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. :OldMenuItemChangeCode;      
  13. m(OldSelfData,Sender,Source,Rebuild);    
  14. end;    
  15. ShowMessage('菜單修改事件掛鉤');end;  
  16.  

這個代碼中最主要的就是如何來調(diào)用原來的FOnChange的執(zhí)行過程了,熟悉Delphi的人應(yīng)該都知道了Delphi的對象過程中可以使用Self表示當(dāng)前對象,而這個對象在對象過程中的傳遞是通過EAX傳遞的,而此時我們的新過程不是在MainMenu.Items的對象內(nèi)部調(diào)用執(zhí)行的,所以,我們需要顯示的傳遞SelfData作為源對象中的Self對象指針,所以我申明了一個指針過程如下:

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

原文鏈接: http://www.cnblogs.com/DxSoft/archive/2011/01/04/1925907.html

【編輯推薦】

  1. Delphi與C#之父:技術(shù)理想架構(gòu)開發(fā)傳奇
  2. Delphi 2010初體驗:徹底告別內(nèi)存泄露
  3. 開發(fā)熱點周報:Delphi 2010出爐 mixin進(jìn)駐JavaFX
  4. Anders Hejlsberg將重返Delphi舞臺?
  5. 9月TIOBE編程語言排行榜發(fā)布 Delphi東山再起

 

責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2012-01-04 10:07:56

Delphi

2011-10-31 14:29:14

2011-04-06 15:51:32

DelphiHOOK

2017-03-06 14:44:49

Androidhook技術(shù)

2011-06-08 14:42:33

C++多維數(shù)組

2010-02-05 15:32:33

Java內(nèi)部類

2009-07-20 14:56:18

iBATIS.NET動態(tài)選擇DAO

2009-07-22 13:04:41

iBATIS動態(tài)查詢

2009-09-14 19:14:51

LINQ動態(tài)查詢

2009-07-15 17:58:07

iBATIS 動態(tài)映射

2016-09-14 21:28:25

JavaScript事件代理委托

2019-10-21 11:04:14

云計算數(shù)據(jù)中心安全

2009-08-12 15:20:21

C#事件處理

2011-09-15 09:52:45

Delphi XE2

2009-09-15 09:19:22

linq動態(tài)條件

2009-07-31 18:12:58

ASP.NET數(shù)據(jù)綁定

2009-06-18 13:51:07

Java虛擬機(jī)

2021-03-16 10:00:40

JavaScript用戶登錄表單JavaScript基

2021-10-19 09:31:19

Javascript 登錄表單前端

2024-12-26 16:13:53

JavaScript開發(fā)表單
點贊
收藏

51CTO技術(shù)棧公眾號