高手能不能给解释一下出错的原因,关于消息处理函数的。

rick111111 2003-10-20 08:48:30
我自定义了一个消息

#define MyMessage WM_USER + 100

然后定义了一个消息处理函数

void DealWithMessage(); //这里有错

程序在debug模式下运行时没有错误, 而在release模式下运行就出错了

我把消息处理函数改成了

LRESULT DealWithMessage(WPARAM wParam, LPARAM lParam);

就没有问题了.

高手能不能给解释一下其中的区别? 为什么一定要声明成下面的形式?为什么只有在release模式下才出错?
...全文
23 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
rick111111 2003-10-20
  • 打赏
  • 举报
回复
好像懂了,不过还是模模糊糊的
leon_z 2003-10-20
  • 打赏
  • 举报
回复
同意楼上

不过你的消息处理函数如果在WindowPorc下判断后再调用,在RELEASE下也是不会出问题的,建议你用这种方式

LRESULT WindowProc(UINT message,WPARAM wParam, LPARAM lParam)
{
if(message == MyMessage )
{
DealWithMessage();
return TRUE;
}
....
}
tigerfox 2003-10-20
  • 打赏
  • 举报
回复

一楼说的不对,与返回值没任何关系。

首先SendMessage/PostMessage函数,是有发送参数的。其次MFC映射消息一般都有参数,这点可以是直接或间接的实现的。再有在Debug/Release调用的MFC库是不一样的,前者是mfc42d.dll, 后者是mfc42.dll,debug会帮你处理很多错误,其错误信息会下调试窗口中输出,以示警告 ; 而Release是没有这么多处理的,严格按照函数调用约定。正如楼上所说,SendMessage/PostMessage发送消息是有参数的,MFC处理也带参数,而你的映射却没为参数分配空间,自然会崩溃.

你地,明白!
wuxfBrave 2003-10-20
  • 打赏
  • 举报
回复
在Debug的时候编译器会保证调用函数的时候会正确的返回, 所以即使你参数不对也没有关系, 只要你没有用到就可以了. 可是在Release的时候, 如果你的参不对, 就会破坏堆栈, 使函数返回的时候不能到正确的地址. 所以就会出错了
sxxny 2003-10-20
  • 打赏
  • 举报
回复
在Debug的时候编译器会保证调用函数的时候会正确的返回, 所以即使你参数不对也没有关系, 只要你没有用到就可以了. 可是在Release的时候, 如果你的参不对, 就会破坏堆栈, 使函数返回的时候不能到正确的地址. 所以就会出错了.
celxta 2003-10-20
  • 打赏
  • 举报
回复
看看SendMessage,PostMessage你也许知道了,它们是接受消息处理后的返回值的,用void是没有返回值的,将导系统错误,对于debug是受内部保护的不会出错,Release内部没有保护是会出错的
leon_z 2003-10-20
  • 打赏
  • 举报
回复
多用几次就明白了 :-)

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧