对MakeObjectInstance的疑问,大侠们请出招(200分)

  • 主题发起人 主题发起人 bbkxjy
  • 开始时间 开始时间
B

bbkxjy

Unregistered / Unconfirmed
GUEST, unregistred user!
VCL的源码中,好象在用TWndMethod类型的新方法去替换一个窗口的窗口过程时都要
先调用MakeObjectInstance,对该方法进行一些处理,再将返回的指针作为新的窗口
过程的入口,现在我有以下疑问:
1、调用MakeObjectInstance是不是为了处理TWndMethod类型方法与标准WindowProc过程
之间参数及返回值之间的差异?
2、新的窗口过程被Windows回调时,控制是如何从MakeObjectInstance返回的过程入口
转移到TWndMethod类型的方法中去的?似乎控制将先从入口转到StdWndProc函数中,
但我想不出为什么进入StdWndProc时,ECX中的值将是一个方法(TWndMethod类型
的方法?)地址的指针(在StdWndProc前的注释是这么说明的)。

不知哪位大侠可以为我解释一下。

 
由于Windows的窗口过程一定要是全局函数,不能是类方法,MakeObjectInstance的作用是使
Delphi的类方法能成为Windows窗口过程的一种内部处理.
 
1 不是,仅仅提供一个新的选择!
2 不知道,也许就是过程的入口地址吧!
 
谢谢 balaschen!第一个问题已经解决,应该如你所说的那样。
第二个问题我仍然想不明白啊,麻烦高手们有空帮看一下 Forms.pas 中
MakeObjectInstance 函数的源码吧。
在 StdWndProc 中,第一行 POP ECX 将栈中内容加载到 ECX 中,此时 ECX 中是
TWndMethod 类型方法的指针,这指针值在进入 StdWndProc 前是在哪儿被压入栈的呢?
另外,MakeObjectInstance 中调用了 VirtualAlloc 分配了内存,怎么没看到在哪
里相应调用 VirtualFree 释放这些内存呢?
谢谢了!不够可以加分啊,不好意思,我还不知道怎么给问题加分:)
 
释放内存好象是由TWinControl.Destroy过程里调用的FreeObjectInstance过程处理。
 
To balaschen:
感谢你的关注!FreeObjectInstance 函数比较简单,在 Forms.pas 中它的
实现就在 MakeObjectInstance 的实现之后,其中并没有调用 VirtualFree 这个与
VirtualAlloc 对应的 API,它只是将传入的指针指向的内存块重新加入到一个全局
的链表中,而该内存块是由 MakeObjectInstance 从这个链表中分配的。具体你可
看一下 Forms.pas 单元。
 
我已弄明白了。
替换后窗口过程入口的代码应该如下:
Call Near Ptr @StdWndProc
//这将使后面TMethod的入口指针入栈
stdWndProc:
Pop ECX //因此ECX 中是TMethod 的入口
谢谢各位的参与!
 
分分了吧!
 
后退
顶部