CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 1 of 1
  1. #1
    Join Date
    May 2002
    Posts
    1,798

    [RESOLVED] MDI Child Splitter crashes on closing last view

    I previously posted on how to create an MFC MDI Child splitter.

    Thread: Problem splitting child window in MFC MDI program and a small demo has been attached to that thread.

    http://forums.codeguru.com/showthrea...ram&highlight=

    Greatly expanding on the concept, I have a similar application built on the same type of framework with syntax colorization and an 'isense-like' capability based on CMFCToolTip. All works well except when I go to close the last (obligatory) view tab to obtain the grey-window, the app crashes.

    Debugger shows:
    Code:
    // wincore.cpp
    
    LRESULT CWnd::DefWindowProc(UINT nMsg, WPARAM wParam, LPARAM lParam)
    {
    	if (m_pfnSuper != NULL)
    		return ::CallWindowProc(m_pfnSuper, m_hWnd, nMsg, wParam, lParam);
    
    	WNDPROC pfnWndProc;
    	if ((pfnWndProc = *GetSuperWndProcAddr()) == NULL)
    		return ::DefWindowProc(m_hWnd, nMsg, wParam, lParam);
    	else
    ==>		return ::CallWindowProc(pfnWndProc, m_hWnd, nMsg, wParam, lParam);
    }
    The simple demo attached to the above thread (the last one) upon which my problem app was built DOES NOT exhibit this problem. I cannot figure out what the problem is. There are a number of postings on MFC MDI split child crashes but none have offered a workable solution.

    Unfortunately I cannot post the actual app that is giving me the problem as it is far too large. But it follows the same basic plan as the demo, but utilizes a number of DLLs.

    Any help greatly appreciated.

    Edit 12.20.2012 - Further info.
    On a Wn2K machine the call stack shows a different problem. I think I know where the problem arises, but it is far to lengthy a discussion to post here. It most likely has to do with a status bar cursor position updater that I have incorporated in the main view. An interesting question is why debugging on different machines results in very different call-stack outputs??

    On the Win2K machine, the debugger call-stack showed the offending code to be on my custom status bar updater designed to indicate the line and column of the view cursor.

    The offending code and it's correction to ameliorate the problem is as follows: Note that the problem is that the CRichEditCtrl pointer, m_wndEditCtrl, is NULL when there is no view page present (gray window), but the updater is still trying to update the line number, so appcrashes.
    Code:
    void CMainFrame::OnUpdateCurPosIndicator(CCmdUI *pCmdUI)
    {
    	CString strCurPos;
    	int nLineNum, nColNum;
    	long nSelStart, nSelEnd;
    
    	nLineNum = nColNum = 0;
    	nSelStart = nSelEnd = 0;
    
    	CMDIFrameWnd *pFrame = (CMDIFrameWnd*)AfxGetApp()->m_pMainWnd; 
    	CMDIChildWnd *pChild = (CMDIChildWnd *)pFrame->GetActiveFrame();
    	CCinView * cv = (CCinView*)pChild->GetActiveView();
    	m_wndEditCtrl = &cv->GetRichEditCtrl();
     >>	if(m_wndEditCtrl == NULL) return;  // avoid crash on final close
    	m_wndEditCtrl->GetSel(nSelStart, nSelEnd);  TRACE1("nSelStart = %d\n", nSelStart);
    	nLineNum = m_wndEditCtrl->LineFromChar(nSelStart);
    	nColNum = nSelStart - m_wndEditCtrl->LineIndex(nLineNum);
    	strCurPos.Format(ID_INDICATOR_CURPOS, nLineNum+1, nColNum+1);
    	m_wndStatusBar.SetPaneText(m_wndStatusBar.CommandToIndex(ID_INDICATOR_CURPOS), strCurPos);
    	
    }// OnUpdateCurPosIndicator(CCmdUI *pCmdUI)
    Once again, a non-obvious null pointer causes a serious problem.
    Last edited by Mike Pliam; December 20th, 2012 at 12:01 PM.
    mpliam

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured