如果我在某函数中向某窗体发了一条消息,如下:……
pWnd->SendMessage(WM_USER_MYMSG);
……
那么程序是应该在SendMessage处只负责把该消息发给系统之后就返回,还是等待pWnd把该消息对应的函数执行完再返回呢?我过去的理解偏向前者,但我发现有些消息有返回值,甚至可以把pWnd处理该消息的某个结果返回,这样的话,就一定是pWnd把WM_USER_MYMSG对应的消息处理函数执行完pWnd->SendMessage(...)才返回。由于对这个问题不明确,我现在使用如下代码:
CM::fun()
{
  int i;
  ...
  pWnd->SendMessage(..., (WPARAM)&i, 0);
}
就有隐患,我想把某个局部变量的地址作为消息的参数传给pWnd,如果按照前面说的第一种执行次序,当pWnd调用消息处理函数时,有可能fun()已结束,i已经不存在了,这必将带来灾难。    请问哪位高手能解答我的问题,或者指点一下哪本书会涉及到此类问题。

解决方案 »

  1.   

    SendMessage 是等函数执行完之后才返回的。(类似于阻塞模式)
    PostMessage 把消息发出去之后就返回了。(非阻塞模式)
      

  2.   

    SendMessage()函数将消息发送到目标窗口,并等待目标窗口过程函数将消息处理完毕才返回!CM::fun()
    {
      int i;
      ...
      pWnd->SendMessage(..., (WPARAM)&i, 0);
    }
    这段代码,你将局部变量的地址作为消息参数传递到目标窗口,目标窗口的窗口过程函数会负责处理这个消息,待消息处理完毕时,你的pWnd->SendMessage(....)才会返回建议你看一下win32编程方面的书籍,详细看一下消息是如何传递和处理的!
      

  3.   

    smilewang(急速传说)说的基本正确。
    我补充几句:
     1。SendMessage是同步模式(发送)消息,只有当消息处理完后才返回的。
     2。PostMessage是异步模式(寄送)消息,发送消息后马上返回(一般未做过消息的处理)
     3。书《VISUAL C++MFC编程实例》在这方面有介绍,可以参考。
     4。你的用法没有问题。
      

  4.   

    SendMessage 是等函数执行完之后才返回的。
    PostMessage 把消息发出去之后就返回了。
      

  5.   

    ,我想把某个局部变量的地址作为消息的参数传给pWnd,如果按照前面说的第一种执行次序,当pWnd调用消息处理函数时,有可能fun()已结束,i已经不存在了,这必将带来灾难。对上这句话
    i不会自动析构的SendMessage是间接调用WindowProc()因为windowproc是可以重入的所有就相当与调用一个函数而已
    PostMessage是发送一条消息到当前线程的消息队列。
      

  6.   

    尽量不要向一个无响应(阻塞)的窗口Send消息,否则也会使发送的线程阻塞.当然也这为同步问题找到一个解决办法.
      

  7.   

    SendMessage 是等函数执行完之后才返回的。
    PostMessage 把消息发出去之后就返回了。