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

原创 hamo  2006-09-01 10:56  阅读 1,792 views 次

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

本文地址:https://www.satwe.com/archives/374.html
关注我们:请关注一下我们的微信公众号:扫描二维码哈默博客的公众号,公众号:aiboke112
版权声明:本文为原创文章,版权归 hamo 所有,欢迎分享本文,转载请保留出处!

发表评论


表情