用wm_copydata在两个程序间传数据 为什么只能用sendmessage 而不可以用postmessage?(200分)

  • 主题发起人 主题发起人 g622
  • 开始时间 开始时间
postmessage 是异步消息队列的函数,不用等待对方处理这个消息,函数立即返回。<br>sendmessage 等待对方处理消息。<br>如果你使用了 postmessage 传递指针,函数马上返回,指针就被销毁了。所以,除了<br>很小心构造的代码,一般不应当使用 postmessage 传递指针。<br>这是属于 windows 协议式编程的一部分内容,是 win32 程序员的基本常识。
 
原来如此!
 
受益非浅!
 
我明白了一些<br>也就是说 如果我用sendmessage,然后让程序立即结束,因为接收程序有可能还没有<br>处理这个消息,我的程序就会出错,这是可能的吗?<br>
 
sendmessage 能够确保对方在处理消息的时候,指针指向的内存区域还是有效的。<br>这是因为 sendmessage 在对方处理完消息才会返回,而你用 sendmessage 传递<br>的指针肯定是有效的。<br><br>但是,postmessage 只是把消息置入消息队列就立即返回了,如果你的程序以为这<br>时候对方已经处理了消息,就可以释放掉分配的内存,而对方在处理的时候这块内<br>存已经无效了。<br><br>sendmessage 对消息队列进行操作的时候,不会让你的窗口处理函数重入(也就是<br>说,这时候你的程序不会处理其他消息)。既然如此,你就不能让程序立即结束。<br>如果极端一点,你用 killprocess 结束了程序,那么依赖它的程序会出错,而且<br>这是可以理解的,对吗?<br>希望我说明白了。
 
用PostMessage出错并不是因为发送者释放了内存的原因,<br>而是因为在跨进程的内存映射方面,SendMessage函数对WM_COPYDATA消息进行了专门的<br>处理,而PostMessage没有。<br><br>所以,即使发送者不释放内存、不适用局部变量、不退出进程,用PostMessage也不行。
 
多谢!<br>清楚了 :)<br>多谢各位答疑解惑!
 
受益非浅!<br>
 
我好久没有闻到分数的腥味了
 
多人接受答案了。
 
后退
顶部