最新消息:

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

技术讨论 hamo 1733浏览 0评论

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

转载请注明:哈默博客 » 由定义消息引起的Debug版正常而Release版异常的问题及解决方案

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址