Categories
技术讨论

由定义消息引起的Debug版正常而Release版异常的问题及解决方案

在使用了自定义消息的程序中,有可能出现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)。
;

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.