我想问的问题是,消息在发送到窗体后,这时候,由系统根据消息的定义,来调用回调函数进行处理窗口过程。
1.这个回调函数是在哪个进程里面的?是属于应用程序的进程还是属于系统单独的进程,因为回调函数得到的为函数的地址。
2.消息到达窗口后,处理的必须为对象的方法。这和回调函数有什么关系?回调函数的函数地址不能是对象的方法地址吗?
3.消息的处理是不是只有窗口之间才可以,也就是说消息只能在隐含或者已有的窗体之间进行传递处理,这个和线程之间的消息传递有什么区别,线程之间也是用消息同步的吗?

解决方案 »

  1.   

    关于前两个问题,李胖子的inside vcl架构剖析有所介绍
      

  2.   

    1、回调函数的执行代码都在本进程的地址空间当中,系统会根据注册的窗口类中的窗口过程地址,进入窗口过程;
    2、对象方法的指针和windows标准方法的指针是有差别的,不能直接使用对象的方法,delphi自身会提供一个方法叫MakeObjectInstance,参数是TWndMethod类型的对象方法,函数对此方法执行转换;
    3、要理解这个问题,要先理解队列消息和非队列消息的执行流程。
      一般来说,与线程之间的消息传递,都是队列消息,常用API:PostMessage or PostThreadMessage;
      当然窗口的消息,比如WM_MOUSEMOVE等也是队列消息——从该GUI线程的消息队列中提取。
      非队列消息就不走消息队列这条路了,直接由API派送到窗口过程,一般是自身或外部直接sendmessage。