也就是怎么能把hwnd变成self?

解决方案 »

  1.   

    function FindControl(Handle: HWnd): TWinControl;
      

  2.   

    谢谢楼上的,我是指在消息处理的流程中,也就是在StdWndProc函数中有句,Mov EAX,[ECX].Longint[4],移动类批针(即Self)到EAX之中,这里,ECX.Longint[4]为是什么是self指针?见Inside VCL 231页。
      

  3.   

    說到匯編, 我就很菜了, 為些, 還老被天才小弟 realLike笑話!好象, 引用對象方法時, 會先將 self 壓入stack, 再壓入參數, 
    所以, ..
      

  4.   

    function FindControl(Handle: HWnd): TWinControl;
      

  5.   

    to: aiirii(ari-爱的眼睛) 
    关键就是self是怎么得来的?怎么能通过hwnd得到self指针?这块是怎么转换的?
      

  6.   

    self指针是在编译时指定的,在运行时分配的内容。通过hwnd得到控件的self的指针可以使用FindControl,当然还可以直接使用ObjectFromHWnd找到,或者使用SendMessage(Handle, RM_GetObjectInstance, 0, 0)也可以得到VCL的指针。(我的汇编还停留在8086阶段,以下也是我的揣测)StdWndProc中的汇编语句就是进行register调用与stdcall调用的转换,将类地址作为stdcall方法的一个参数。因为stdcall调用是4字节方法调用,而register调用是8字节的(类地址+方法地址),因此需要将类指针作为一个参数传入转换成的stdcall方法中。