响应通过PostThreadMessage函数发出的自定义消息的MESSAGE_HANDLE是:
ON_THREAD_MESSAGE
比如,有自定义消息:
#define WM_SET_NCREADY (WM_USER + 0x451)
通过下面函数发送消息:
PostThreadMessage(WM_SET_NCREADY, 0, 0);
MESSAGE_HANDLE是:
ON_THREAD_MESSAGE(WM_SET_NCREADY, OnSetNcReady)
处理函数的参数接口应该是:
afx_msg void OnMyThreadMsg(WPARAM, LPARAM)
可是我错误地写作:
afx_msg void OnMyThreadMsg()
这导致了在release版本,程序崩溃。
注意: 1 在编译时候,没有报告错误,或者警告。
2 该错误非常难调试,因为突然程序就崩溃了,而且是调试版本,更可恨的是callstack也崩溃了,无法追踪错误的来源。
3 这也说明了函数原形的重要性、类型强制转换的危险性。
怎样调试仅在release版本出现的问题:
1 在project setting中,C/C++优化设为:disable(debug),Debug info设为:Program Database for Edit and Continue
2 在project setting中,Link设为:[enable]Generate debug info
3 把最近的正确版本调出来,进行比较,从而试着发现问题。
在问题解决后,发现了下面文章,详细描述了该问题,请参考:
PRB: Incorrect Function Signatures May Cause Problems in Release