RELEASE 下这句话会出错?(DEGUG 下没有问题)

tt_timon 2008-04-05 08:56:53
我的程序在debug版本下编译 运行都没有问题 ,可是release后编译没有问题 运行的时候说xx指令xx内存不能为read。我定位了一下,发现是这个函数里面这句话有问题:
void CMainFrame::OnDataReady()
{
CMainFrame* pMFrm=(CMainFrame*)AfxGetMainWnd();

CView * pView=(CView*)pMFrm->GetActiveView();


pView->PostMessage(WM_REFRESH2,0,0);//有问题



}
其中
WM_REFRESH2是我自己定义的消息 我在MainFrame里面把消息转发给自己的VIEW 不知道为什么release 下会出错,我把他开始赋了个NULL的初值 也没用。求解!!!!!!!!!!!!!
...全文
180 点赞 收藏 26
写回复
26 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tt_timon 2008-04-07
结贴说明:错误我已经解决,是release下自定义消息的书写问题:
一定要写成: afx_msg void OnDataReady(WPARAM wParam, LPARAM lParam);
不能写成: afx_msg void OnDataReady();
函数体要写成:void CMainFrame::OnDataReady(WPARAM wParam, LPARAM lParam)
{
CKbView * pView=(CKbView*)(this->GetActiveView());
。。。。。
}
虽然我自己在postmessage 的时候已经把两个参数置零了,不过debug下你可以写成我原来那个样子,release下一定要把两个参数仍然写出来。就是这个问题!
谢谢大家。
回复
arong1234 2008-04-06
关注一点修改Document/FrameWnd类的成员变量的代码,有可能是那部分代码出问题的
回复
tt_timon 2008-04-06
[Quote=引用 22 楼 cnzdgs 的回复:]
你的OnDataReady函数是在什么时候执行的?
[/Quote]另外一个进程给它发这个消息(自定义消息) 它响应这个消息
回复
cnzdgs 2008-04-06
你的OnDataReady函数是在什么时候执行的?
回复
arong1234 2008-04-06
所以说内存访问越界导致得问题会有随机性,有时就没道道可以讲得
回复
tt_timon 2008-04-06
[Quote=引用 19 楼 arong1234 的回复:]
内存访问越界导致的问题会有一点随机性,出现错误的地方,不一定是导致问题的地方
[/Quote]内存访问越界?我这里确实用了大数组,不过我把消息全部删掉,其他功能保留,也是这种数组操作方式,没有问题,有可能是pView的问题,可是为什么加上一个AfxMessageBox会没有问题?
回复
arong1234 2008-04-06
内存访问越界导致的问题会有一点随机性,出现错误的地方,不一定是导致问题的地方
回复
arong1234 2008-04-06
debug和release是不一定有可比性的,debug出现的错误在release中出错,但是不能找到所有错误

从你现象看,我个人怀疑有内存访问越界的可能性,但是没有直接证据
回复
arong1234 2008-04-06
很显然pView不对,但是为什么不对,从你的代码看不出
回复
tt_timon 2008-04-06
+ pMFrm 0x00c92658 {CMainFrame hWnd=0x002b047e}
+ pView 0xcccccccc {CKbView hWnd=???}
+ this 0x00c92658 {CMainFrame hWnd=0x002b047e}
回复
tt_timon 2008-04-06
[Quote=引用 13 楼 arong1234 的回复:]
不是一开始就叫你进行返回值检查,为什么不做?问题怎么能光靠猜测和询问得到解决?
[/Quote]返回值没有问题
回复
arong1234 2008-04-06
再说,绘图就应该集中到CKbView::OnDraw中,多处绘制本来就会导致一堆问题
你强制获得pView,能缺定它一定不是NULL?
如果你在CMainFrame中获得CMainFrame的指针有意义么?this指针在这种情况下就应该是和AfxGetMainWnd返回值一样的
[Quote=引用 12 楼 tt_timon 的回复:]
问题补充:
我现在不在框架类把消息再转发一次了 我直接获得CMYVIEW的指针,在框架类里面画图:现在的问题很奇怪:
void CMainFrame::OnDataReady()
{ AfxMessageBox("a"); //把这句话删掉,release下就会出错
CMainFrame* pMFrm=(CMainFrame*)AfxGetMainWnd();
CKbView * pView=(CKbView*)pMFrm->GetActiveView();
。。。。
}
好像AfxMessageBox()有触发消息循环的功能,为什么这里删掉就会出错?求解
[/Quote]
回复
arong1234 2008-04-06
不是一开始就叫你进行返回值检查,为什么不做?问题怎么能光靠猜测和询问得到解决?
回复
tccqs 2008-04-06
to 23楼:
你试着将OnDataReady放到其它地方执行一下,,
比如,,放到一个按钮的响应函数里,,若仍有问题
可以断定是这个OnDataReady函数有问题,,
若没了问题,,也可能是给发消息的进程有问题,,
回复
tt_timon 2008-04-06
问题补充:
我现在不在框架类把消息再转发一次了 我直接获得CMYVIEW的指针,在框架类里面画图:现在的问题很奇怪:
void CMainFrame::OnDataReady()
{ AfxMessageBox("a"); //把这句话删掉,release下就会出错
CMainFrame* pMFrm=(CMainFrame*)AfxGetMainWnd();
CKbView * pView=(CKbView*)pMFrm->GetActiveView();
。。。。
}
好像AfxMessageBox()有触发消息循环的功能,为什么这里删掉就会出错?求解
回复
Mr-Chen 2008-04-06
看看 pView 是不是有问题,是不是NULL
回复
tt_timon 2008-04-05
因为release 下不知道怎么调 所以我是这样看的:用AfxMessageBox插对话框进去,结果插到这句话前面显示了对话框 查到后面不了我想要的对话框 我把这个消息删除掉,没有错误 。所以我认为是这个消息的错。可我debug下一点问题都没有。所以无解。我这个消息因为是框架类发给视图类的,所以我框架类的头文件定义了一下,视图类的头文件也定义了一下,难道是因为这个?可是debug 为什么没错?
回复
scq2099yt 2008-04-05
查查其他的地方是否有问题
回复
txk1452 2008-04-05
WM_REFRESH2的处理函数有没有问题?
回复
cnzdgs 2008-04-05
调试看pView的值是不是NULL。
另外可以直接这样写:
GetActiveView()->PostMessage(WM_REFRESH2,0,0);
回复
加载更多回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

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

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