在使用了自定义消息的程序中,有可能出现Debug版正常而Release版非法操作的问题。
下面是一种原因以及其解决办法:
问题的描述:
================
定了了自定义消息: #define WM_DEMOWORK WM_USER+1
消息相应函数: afx_msg void OnDemoWork();
消息映射: ON_MESSAGE(WM_DEMOWORK,OnDemoWork)
上述代码编译没有任何错误,并且在Debug版中运行正常,但是在Release版中会报非法
操作。
原因:
================
在MFC中,ON_MESSAGE宏的定义如下:
#define ON_MESSAGE(message, memberFxn) { message, 0, 0, 0, AfxSig_lwl,
(AFX_PMSG)(AFX_PMSGW)(LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM,
LPARAM))&memberFxn },
可见,在ON_MESSAGE宏中认为消息相应函数memberFxn的原型为 LRESULT
(*pProc)(WPARAM, LPARAM)的形式,它有两个参数,
分别为WPARAM, LPARAM。
解决方案
===============
了解具体的原因后,解决就非常容易。有两个方案:
方案1:
修改消息相应函数的定义,增加函数参数。如:
afx_msg void OnDemoWork(WPARAM wParam, LPARAM lParam);
方案2:
如果消息相应函数中不需要消息参数,可以利用另外一个消息映射宏ON_MESSAGE_VOID
即可。如
ON_MESSAGE_VOID(WM_DEMOWORK,OnDemoWork)
其中ON_MESSAGE_VOID的宏定义为:
#define ON_MESSAGE_VOID(message, memberFxn) { message, 0, 0, 0, AfxSig_vv,
(AFX_PMSG)(AFX_PMSGW)(void (AFX_MSG_CALL CWnd::*)(void))&memberFxn },
其中消息相应函数原型为void (*pProc)(void)。
;