关于PostMessage()的两个隐患
ecai 2001-03-07 10:02:00 1) PostMessage()在DEBUG版本和Release版本的区别
对于一个自定义message的handler,其标准声明形式为:
afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);
由于我写程序时懒惰,而且通常不需要使用参数,所以经常定义成:
afx_msg void OnMyMessage();
即忽略了返回值和参数。返回值定义成void没有影响,但是如果不显式定义参数则会造成问题:在DBBUG版本中运行正常,在RELEASE版本中使用PostMessage()发送同一条自定义消息时,第二次会产生一般保护性错误!只要加上参数的显式定义就没有问题了。
请教:为什么会出现这种情况?我找遍了MSDN,似乎没有提醒注意这个问题。我写了一个很简单的程序发送两次自定义消息,证明的确会有这个问题。
2) PostMessage()不发送时耗尽资源
使用::PostMessage() (API版本的PostMessage)时,如果HWND参数为NULL时,如
UINT wParam,lParam;
。。。。。 // 给参数赋值
::PostMessage(glpMyWnd->GetSafeHwnd(),UM_MY_MESSAGE,(WPARAM)wParam,(LPARAM)lParam);
其中glpMyWnd是一个全局的CWnd指针,当相应的窗口没有打开时,实际上glpMyWnd->GetSafeHwnd()的结果为NULL。
这样实际上消息没有被处理,但是每次会消耗资源,发送多次(如100次)后资源明显减少,甚至可能会耗尽资源,如果关闭程序,则资源可以恢复正常,证明不是由于内存泄露造成。
如果我将代码修改为:
if (glpMyWnd->GetSafeHwnd())
::PostMessage(glpMyWnd->GetSafeHwnd(),UM_MY_MESSAGE,(WPARAM)wParam,(LPARAM)lParam);
即保证当glpMyWnd有效时才调用PostMessage()发送消息,则不会有问题。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
但是我NEW了一个测试程序,试验这样的代码,却无法发现同样的情况
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
上述代码是在一个工作线程(Worker Thread)中,所以我在测试程序中也产生了一个线程,但是也没有问题
请问如何解释???
THANK A LOT FIRST!
可以发EMAIL给我: ecai@263.net