昨天把MakeObjectInstance的代码详细研究了一下,当然还有众多前辈高手们的帮助,终于大致搞明白了是怎么回事。但是给我顿悟的,不是高手们的帖子,而是来自我自己的一个疑惑,TObjectInstance这么小,一共才13个字节,显然不可能存储整个MainWndProc的函数内容,更不用说WndProc函数的内容,只能存储它们的地址。也不可能把窗口函数的内容拆散了放在不同的TObjectInstance里,那样虽然可以,但是何不把TObjectInstance设计的大一些呢,设计VCL代码的都是高手中的高手,不可能犯这样的低级错误。正是从这一点出发,我明白了,MakeObjectInstance函数不过是换种方式调用MainWndProc,而不是把MainWndProc的内容整个存储在MakeObjectInstance建立的区块里(我一直以来就是这么认为的),每个TObjectInstance小区块最终记住的是每个Delphi类(比如TButton)的MainWndProc函数地址,外加跳转语句。
与之而来的推论是,TInstanceBlock建立了314个小区块TObjectInstance的列表,第一个小区块存储了TApplication.WndProc的地址(不是虚函数,如果变成虚函数就不行了),第二个小区块存储了TForm.MainWndProc的地址,如果Form1上只有一个Button1,那么第三个区块存储了TButton.MainWndProc的地址,以此类推。一般情况下,程序员用的了314那么多带回调函数的类吗?好像不需要,只有界面Win控件才需要这个。万一超过了也不要紧,Delphi还会给我们建立下一个314列表。我不明白的是,这么浅显的结论,高手们为什么不明确说出来呢,像我这样举个例子多么容易理解啊,真是郁闷,这么多年都高看了MakeObjectInstance的神秘之处,其实挺简单嘛!
参考:
http://blog.csdn.net/linzhengqun/article/details/1451088