的程序在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的初值 也没用。求解!!!!!!!!!!!!!
因为release 下不知道怎么调 所以我是这样看的:用AfxMessageBox插对话框进去,结果插到这句话前面显示了对话框 查到后面不了我想要的对话框 我把这个消息删除掉,没有错误 。所以我认为是这个消息的错。可我debug下一点问题都没有。所以无解。我这个消息因为是框架类发给视图类的,所以我框架类的头文件定义了一下,视图类的头文件也定义了一下,难道是因为这个?可是debug 为什么没错?

解决方案 »

  1.   

    WM_REFRESH2的消息处理函数是否有问题呢?
      

  2.   

    虽然是PostMessage,不过也确实如楼上所说有可能是响应函数有问题。因为用AfxMessageBox会触发内部的消息循环,完全有可能在消息框显示之前执行到消息响应函数。要彻底定位,最好是用OutputDebugString来判断。在这之前最好确认pView是合法的,将地址和IsWindow返回的值都打出来比较合适。
      

  3.   

    degug在函数推出,恢复栈时,比release多做一些事,帮助函数把栈恢复
      

  4.   

    先检查是否pView是否正确,还有你的view是什么类型?你传一个消息给Cview好像不对,应该 传给你自己的view.
      

  5.   

    问题补充:
    我现在不在框架类把消息再转发一次了 我直接获得CMYVIEW的指针,在框架类里面画图:现在的问题很奇怪:
    void CMainFrame::OnDataReady()
    AfxMessageBox("a"); //把这句话删掉,release下就会出错
    CMainFrame* pMFrm=(CMainFrame*)AfxGetMainWnd();
    CKbView * pView=(CKbView*)pMFrm->GetActiveView();

    }
    好像AfxMessageBox()有触发消息循环的功能,为什么这里删掉就会出错?求解
      

  6.   

    检查一下CKbView * pView=(CKbView*)pMFrm->GetActiveView();的返回值是否正确有效。
      

  7.   

    我只能在DEBUG下检查 这个时候是对的 release下怎么检查?
      

  8.   

    内存访问越界不是那么容易找到的,估计你先需要进行代码走查,排除任何可能的错误
    至于访问越界问题本身,可能需要跟踪每个变量的内存发生的变化,需要在内存中找到每个被写入的单元,看看是不是写到非法的单元中去我估计是你修改了CDocument或者CMainFrame类的某个成员变量,破坏了保存view列表的那个数据结构
      

  9.   

    结贴说明:错误我已经解决,是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下一定要把两个参数仍然写出来。就是这个问题!
    谢谢大家。