一个自定义消息引发的血案

来源:互联网 发布:网络的坏处英语作文 编辑:程序博客网 时间:2024/05/18 02:45

在项目中我们经常会使用自定义消息,有时候只是为了触发一个事件而已,所以很多时候我们比较懒,在接受消息的时候采用void getEvent(),然后做消息映射,但是这个失误导致了我半天的工作量!下面说下具体经过

环境:VC6 + UNICODE + XPSP3

在发送消息的地方定义了一个消息,然后SendMessage(WM_MESS,NULL,NULL),在接受的地方,定义一个函数用来响应消息void GetMess(),然后在CPP文件中添加消息映射,ON_MESSAGE(WM_MESS, GetMess),这样在DEBUG模式下没有错误,但是在Release模式下,只要触发了该事件,return后直接异常,异常的地方在MFC42U.DLL中,使用windebug,看到的消息是mfc42u.dll中有符号不能导出,开始以为是调试版本和发行版本的DLL库不一样导致,于是在网上找了一大堆的DLL库回来测试,发觉所有都有这个问题,后来经过分析,觉得可能是这个自定义消息的问题,于是修改代码为

LRESULT GetMess(UINT wParam, LONG lParam);

再编译,问题解决!

原因:在VC6中如果返回类型为void 的会破坏栈。

PS:在VC6以后版本中自定义消息的返回类型必须为LRESULT,否则编译不过.如果不需要返回值和参数可以使用ON_MESSAGE_VOID这个宏

原创粉丝点击