MakeObjectInstance的关键理解

昨天把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

时间: 2024-11-05 16:09:15

MakeObjectInstance的关键理解的相关文章

Git使用关键理解

Git的使用关键理解几个概念: 远程仓库 => 本地仓库 => 缓存区 => 工作空间 暂存本地修改 git stash 拉取远程分支(origin或者upstream)修改,此处可能是fork的别人的代码,所以需要git remote add upstream 别人仓库地址 git fetch origin or git fetch upstream 合并本地代码(假设是master分支) git merge origin/master 将暂存的修改从暂存区释放出来 git stash

C# String 字符串一些关键理解

#1 :在.Net Framework中,字符总是表示成16位Unicode的代码#2 :String 和string 其实是一样的只是表现形式上不同#3 :string类型被视为基元类型,也就是编译器允许在源代码中直接使用字面值表示字符串,编译器将这些字符串放到模块的元数据中,并在运行时加载和引用它们. 1 static void Main(string[] args) 2 { 3 string s = "2"; 4 Console.WriteLine(s); 5 Console.R

Hadoop快速入门

传说中的Hadoop,我终于来对着你唱"征服"了,好可爱的小象,!J 总的来说,hadoop的思路比较简单(map-reduce),就是将任务分开进行,最后汇总.但这个思路实现起来,比较复杂,但相对于几年前Intel等硬件公司提出的网格运算等方式,显得更加开放. 你难任你难,哥就是头铁! Tip:实践应用是核心,本文概念为主,有些部分可能会有些晦涩,直接跳过就好(不是特别重要). 本文代码实践在:https://github.com/wanliwang/cayman/tree/mast

UML和模式应用5:细化阶段(1)--概述

1.前言 从本文开始进入细化阶段,讨论迭代技术的基础,本次讨论将着重讨论第一次迭代,以POS机为例. 2. 第一次迭代处理的需求(以NextGen POS项目处理销售用例) 实现 处理销售 用例中基本和关键的场景:输入商品项目并收取现金 实现用于支持迭代初始化需要的启动用例 不处理任何特殊和复杂的部分,仅仅针对场景的简单理想路径,并对此进行设计和实现 不与外部服务进行协作 不应用复杂的定价规则 不考虑UI支持.数据库内容的支持 3. 迭代过程,并非一次就实现所有需求 迭代生命周期方法的关键理解:

0909 海贼王我当定了

1.编译原理学什么? 懂点计算机硬件原理..例如所有运算只能在特定的寄存器中计算,然后存回ram(变量所在地) 2.为什么学编译原理? 可以让你更彻底地理解一门语言.从计算机的角度看待程序设计语言的本质,从基层理解语言,写代码的时候更能得心应手. 3.怎么学编译原理? 关键理解有限状态机和下推自动机,分别对应正则语言和上下文无关语言.这课很有意思,和计算理论一起学会事半功倍 4.思考:在没有学习本书理论之前,如果让你写一个编译器,你是什么思路? 没有!!!!!!!!!!!!!!!!!!!!!!!

2.2 关系代数运算

2.2.1 关系代数的五个基本操作 考核要求:达到“简单应用”层次 知识点:五个基本操作的含义和运算应用 (1)并(∪):两个关系需有相同的关系模式,并的对象是元组,由两个关系所有元组构成.  RUS≡{t| t∈R ∨t∈S} (2) 差(-):同样,两个关系有相同的模式,R和S的差是由属于R但不属于S的元组构成的集合.  R-S≡{t| t∈R ∧t 不属于S} (3)笛卡尔积(×):对两个关系R和S进行操作,产生的关系中元组个数为两个关系中元组个数之积.  R×S≡{t| t=< tr,t

差异更新

#include <iostream> //下面说的是在服务器差异脏标记,不管在想客户端还是在数据库中经常用到的一种方法 //由于其实直接拿为进行操作,所以速度是非常快的,也许刚开始不太好理解,但只要熟悉之后就非常好用 //对于包而言如果Update包只改变一项你把整个结构体都发过去会大大增加网络带快,现在基本都走差异更新 enum UpdateAtt { eUpdate1, eUpdate2, eUpdate3, eUpdate4, eUpdate5, eUpdate6, eUpdate7,

三角学知识复习

诱导公式: θ关于原点对称的角为π+θ,关于X轴对称的为-θ,关于Y轴对称的为π-θ(关键理解点:先负角度,然后在加上π),关于y=x对称的角为π/2-θ 因为在单位圆中,sinθ=y,cosθ=x,tanθ=y/x,根据这几个对称,有

android中的数据库操作(转)

android中的数据库操作 android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作. 一.android内的数据库的基础知识介绍 1.用了什么数据库   android中采用的数据库是SQLite这个轻量级的嵌入式开源数据库,它是用c语言构建的.相关简介可以从链接查看. 2.数据库基本知识观花   对于一些和我一样还没有真正系统学习数据库技术的同学来说,把SQL92标准中的一些基本概念.基本语句快速的了解一下,是很有必要的,这样待会用Android的da