博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Delphi XE的RTTI增强,动态Hook某些内部事件
阅读量:4149 次
发布时间:2019-05-25

本文共 1531 字,大约阅读时间需要 5 分钟。

Delphi2010之后的RTTI做了很大休整,现在用起来很爽了哦。甚至可以获取某些类的内部私有单元,然后为其赋值!讲这个RTTI增强的,可以参考网上的多个博客内容,我列举一下:

 

我这里的主要目的是挂钩某些内部私有事件,然后增加上一些自己的处理过程,这里我以TMenuItem的私有内部事件FOnChange作为例程。 这个私有事件在菜单内部绑定,我们平常状态下,在外部无法更改!但是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;

上面的代码就设置了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);

对于本申明过程,如果不是很明白的, 。

 

 

转载地址:http://bkpti.baihongyu.com/

你可能感兴趣的文章
[LeetCode]Spiral Matrix
查看>>
[LeetCode]Spiral Matrix II
查看>>
[LeetCode]Sqrt(x)
查看>>
[LeetCode]String to Integer (atoi)
查看>>
[LeetCode]Subsets
查看>>
[LeetCode]Subsets II
查看>>
[LeetCode]Substring with Concatenation of All Words
查看>>
[LeetCode]Sudoku Solver
查看>>
[LeetCode]Sum Root to Leaf Numbers
查看>>
[LeetCode]Surrounded Regions
查看>>
[LeetCode]Swap Nodes in Pairs
查看>>
[LeetCode]Symmetric Tree
查看>>
[LeetCode]Text Justification
查看>>
[LeetCode]Trapping Rain Water
查看>>
[LeetCode]Triangle
查看>>
[LeetCode]Two Sum
查看>>
[LeetCode]Unique Binary Search Trees
查看>>
[LeetCode]Unique Binary Search Trees II
查看>>
[LeetCode]Unique Paths
查看>>
[LeetCode]Unique Paths II
查看>>