一个超难的问题???

lzn1 2004-08-05 11:47:51
在文档类中往框架类发消息,在debug下完全正常,在release模式下异常
显示mfc42.dll异常,选择重试 发现在CMapPtrToPtr::GetValueAt处异常。
若用postmessage发,发到第二次时出现以上情况,
若用sentmessage发,发到第一次时就出现以上情况。
开始时以为自己的接收消息函数功能出错,后注释调函数内所有的代码,异常依然,可见是postmessage/sentmessage后出现的异常。(若不发送消息则不出错,我试过)一下是我的代码:
CMainFrame * mainwnd=(CMainFrame *)AfxGetApp()->GetMainWnd();
::PostMessage(mainwnd->m_hWnd,WM_REFRESHFILELIST,NULL,NULL);
定义的WM_REFRESHFILELIST 为 WM_USER+1000
本程序采用的是 single document结构
...全文
112 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ljlln 2004-08-05
gz
回复
lutong 2004-08-05
同意whale;另外检查是否有变量没有初始化
回复
DentistryDoctor 2004-08-05
程序的其它位置的问题也可能关联到此,尤其重点检查使用了Hash表(或什么数据结构底层使用了)的地方。
回复
DentistryDoctor 2004-08-05
可能是消息响应函数实现有问题,而不是定义的问题。我遇到过个问题,我说说我是在什么情况下遇过的这个问题你就明白了,主要是程序的堆栈被破坏了。比如说你定义了一个256字节的缓冲区,但你向其中填充300字节。我当时的程序出错的位置也是在CMapPtrToPtr::GetValueAt,不过我是用的VC7.1。内存泄漏也可能造成这个问题,我也遇到过。
回复
vcar 2004-08-05
同意 whale() ,检查消息响应函数的参数表。
回复
flyelf 2004-08-05
afx_msg LRESULT Onxxx(WPARAM wParam, LPARAM lParam);
回复
whale 2004-08-05
可能你的消息响应定义有问题,我也遇到过。
正确的消息函数定义应该是void OnMsgxxxx(WPARAM wparam, LPARAM lparam);即使wparam和lparam没有意义,也需要这样定义,否则在Release版会出错。
回复
a_melon 2004-08-05
ON_MESSAGE的定义是:
#undef ON_MESSAGE
#define ON_MESSAGE(message, memberFxn) \
{ message, 0, 0, 0, AfxSig_lwl, \
(AFX_PMSG) (AFX_PMSGW) (static_cast< LRESULT (AFX_MSG_CALL
CWnd::*)(WPARAM, LPARAM) > (&memberFxn)) },
就是说会把函数指针转换为一个CWnd::的成员函数指针。而线程并不是从CWnd派生的。
返回应该为 LRESULT

应该使用:
#undef ON_THREAD_MESSAGE
#define ON_THREAD_MESSAGE(message, memberFxn) \
{ message, 0, 0, 0, AfxSig_vwl, \
(AFX_PMSG)(AFX_PMSGT)(static_cast<void (AFX_MSG_CALL
CWinThread::*)(WPARAM, LPARAM)>(&memberFxn)) },
注意这个映射函数返回值是void。

如果这些函数的原型不对,在DEBUG版是没有问题的,在release版里,可能出现问题:
CAUSE
The message handlers for ON_MESSAGE(), ON_REGISTERED_MESSAGE(), ON_THREAD_MESSAGE(), and ON_REGISTERED_THREAD_MESSAGE() require the programmer to have the correct function signatures. By not having a correct function signature for the handler, an invalid page fault in Mfc42.dll results after the handler executes in release builds. A crash in debug builds does not occur because the stack frame is set up differently for debug builds than it is for release builds.

(参见: PRB: Incorrect Function Signatures May Cause Problems in Release
Q195032)

为了让编译器可以检查这种错误,可以在stdafx.h文件的#include <afxwin.h>后加入以下定义(在VC7里已经采用这种方式定义,所以如果我们代码要转移到VC7编译的话,原来不规范的地方将编译错误。):

#undef ON_MESSAGE
#define ON_MESSAGE(message, memberFxn) { message, 0, 0, 0, AfxSig_lwl, (AFX_PMSG) (AFX_PMSGW) (static_cast< LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM) > (&memberFxn)) },


#undef ON_REGISTERED_MESSAGE
#define ON_REGISTERED_MESSAGE(nMessageVariable, memberFxn) { 0xC000, 0, 0, 0, (UINT)(UINT*)(&nMessageVariable), (AFX_PMSG)(AFX_PMSGW)(static_cast<LRESULT (AFX_MSG_CALL CWnd::*)(WPARAM, LPARAM)>(&memberFxn)) },


#undef ON_THREAD_MESSAGE
#define ON_THREAD_MESSAGE(message, memberFxn) { message, 0, 0, 0, AfxSig_vwl, (AFX_PMSG)(AFX_PMSGT)(static_cast<void (AFX_MSG_CALL CWinThread::*)(WPARAM, LPARAM)>(&memberFxn)) },


#undef ON_REGISTERED_THREAD_MESSAGE
#define ON_REGISTERED_THREAD_MESSAGE(nMessageVariable, memberFxn) { 0xC000, 0, 0, 0, (UINT)(UINT*)(&nMessageVariable), (AFX_PMSG)(AFX_PMSGT)(static_cast<void (AFX_MSG_CALL WinThread::*)(WPARAM, LPARAM)>(&memberFxn)) },
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2004-08-05 11:47
社区公告

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