我自定义了一个消息#define MyMessage WM_USER + 100然后定义了一个消息处理函数void DealWithMessage(); //这里有错程序在debug模式下运行时没有错误, 而在release模式下运行就出错了我把消息处理函数改成了LRESULT DealWithMessage(WPARAM wParam, LPARAM lParam); 就没有问题了.高手能不能给解释一下其中的区别? 为什么一定要声明成下面的形式?为什么只有在release模式下才出错?

解决方案 »

  1.   

    看看SendMessage,PostMessage你也许知道了,它们是接受消息处理后的返回值的,用void是没有返回值的,将导系统错误,对于debug是受内部保护的不会出错,Release内部没有保护是会出错的
      

  2.   

    在Debug的时候编译器会保证调用函数的时候会正确的返回, 所以即使你参数不对也没有关系, 只要你没有用到就可以了. 可是在Release的时候, 如果你的参不对, 就会破坏堆栈, 使函数返回的时候不能到正确的地址. 所以就会出错了.
      

  3.   

    在Debug的时候编译器会保证调用函数的时候会正确的返回, 所以即使你参数不对也没有关系, 只要你没有用到就可以了. 可是在Release的时候, 如果你的参不对, 就会破坏堆栈, 使函数返回的时候不能到正确的地址. 所以就会出错了
      

  4.   


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

  5.   

    同意楼上不过你的消息处理函数如果在WindowPorc下判断后再调用,在RELEASE下也是不会出问题的,建议你用这种方式LRESULT WindowProc(UINT message,WPARAM wParam, LPARAM lParam)
    {
       if(message == MyMessage )
       {
            DealWithMessage(); 
            return TRUE;
       }
       ....
    }