在vc++里面,debug模式运行出错,但在release模式下能正常运行,怎么办? 
我只是想在子窗体中调用主窗体的菜单! 如下: 
void CTrsWnd::OnContextMenu(CWnd* pWnd, CPoint point) 

CMenu menu; 
VERIFY(menu.LoadMenu(IDR_POPUPMENU)); 
(CMainFrame*)m_pFrame =(CMainFrame*)AfxGetApp()->m_pMainWnd; 
CMenu* pPopup = menu.GetSubMenu(0); 
ASSERT(pPopup != NULL); 
//CWnd* pWndPopupOwner = this; 
pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, m_pFrame); 
} 有什么别的好办法吗? 
谢谢!

解决方案 »

  1.   

    你构造的菜单对象在函数返回时自动析构了,所以非常不好。你应该用脱离函数使菜单句柄保持有效,不然就将菜单对象改成静态或全局吧。
    好象是,CMenu::Deattch();记不清了,查MSDN吧。
      

  2.   

    问题应该是出在m_pFrame上面!
      

  3.   

    用BoundChecker查一下比较省力不过最好还是自己分析代码吧
      

  4.   

    有没有可能是VERIFY和ASSERT宏的原因?
      

  5.   

    晕~~~~~~~~
    改成这样也一样只能在release下通过!
    void CTrsWnd::OnContextMenu(CWnd* pWnd, CPoint point) 

    CMenu menu;
    VERIFY(menu.LoadMenu(u_idPopupMenu));
    CMenu* pPopup = menu.GetSubMenu(0);
    ASSERT(pPopup != NULL);
    //CWnd* pWndPopupOwner = this;
    ::TrackPopupMenu(pPopup->m_hMenu,TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, 0, pWndPopupNemu->GetSafeHwnd(), NULL);

    大侠帮帮忙!
      

  6.   

    补充:改成这样是完全可以通过的!void CTrsWnd::OnContextMenu(CWnd* pWnd, CPoint point) 

    CMenu menu; 
    VERIFY(menu.LoadMenu(IDR_POPUPMENU)); 
    (CMainFrame*)m_pFrame =(CMainFrame*)AfxGetApp()->m_pMainWnd; 
    CMenu* pPopup = menu.GetSubMenu(0); 
    ASSERT(pPopup != NULL); 
    //CWnd* pWndPopupOwner = this; 
    pPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, this); 
    } 把菜单的所属改为本窗体this!
    但是这样的话,向要调用退出整个程序的onclose或者是about对话框,由或者是调用其他子窗体就变得非常困难了!而且追后还是得用(CMainFrame*)m_pFrame =(CMainFrame*)AfxGetApp()->m_pMainWnd; 这样的调用吧?
    高手谢谢!
      

  7.   

    终于被我搞定了!
    原来是另外一个函数惹的祸!
    void CTransparentAniWnd::OnRButtonDown(UINT nFlags, CPoint point) 
    {
    // TODO: Add your message handler code here and/or call default
    // if(m_pFrame!=NULL)
    // {
    // if(m_pFrame->IsWindowVisible())
    // {
    // m_pFrame->SetForegroundWindow();
    // SetFocus();
    // }
    // }
    CWnd::OnRButtonDown(nFlags, point);
    //CLittlePigDlg dlg;
    //if(IDOK!=dlg.DoModal())
    // DestroyWindow();
    }
    麻烦大家不好意思了!