자료 저장소


(Debug Assertion Failed Error는 굉장히 광범위한 에러입니다.
본 게시물은 VisualStudio 6.0 서비스팩을 설치하지 않았을 때 발생하는 에러입니다.
해당사항이 아닌 분들은 시간을 아끼심이...)


황당하게 에러가 발생할 때가 있다
뭐냐~ -ㅅ-)
책을 따라하다 예제 그대로 따라해도,
저자가 하란대로 했는데 도대체 뭐가 문젠지...
아주 이젠 대놓고, 어플위자드로 프로젝트를 생성하고 바로 실행해도 이 에러가 난다.
Visual Studio 6.0

디버깅을 해서 Call Stack을 통해 올라가보면
문제의 winocc.cpp 331라인은 다음과 같다

329: CWnd* CWnd::SetFocus()
330: {
331: ASSERT(::IsWindow(m_hWnd)); 
332: if (m_pCtrlSite == NULL)
333:  return CWnd::FromHandle(::SetFocus(m_hWnd));
334: else
335:  return m_pCtrlSite->SetFocus();
336: }

m_hWnd 값이 Null값으로 리턴되는 것 같은데
위에 SetFocus()를 호출하는 부분은
MainFrm.cpp의
void CMainFrame::OnSetFocus(CWnd* pOldWnd)
{
   m_wndView.SetFocus(); <- 여기
}

주석처릴 한다고 해도, 정상적인 윈도우가 생성되지 않으므로, 난감하다.

프로젝트 설정에 문제가 있나싶어, 다양하게 실험을 해 본결과..

무식하게 프로젝트 생성.

한가지 상황에서 위의 에러가 발생하는 것을 알게되었다.


에러가 나는 조합
어플타입을 Single Document로 두고, Doc/View 구조를 지원하지 않도록 해제한다.
다음,
Active X 컨트롤은 해제여부가 크게 상관없고,
이 부분,
Docking Toolbar와 Initial Status bar 모두 해제 시킨다.

그럴경우 위의 에러가 발생하며,
만약 Single이 아닌 Multiple로 바꾼다거나
Doc/View 지원을 선택하거나
도킹툴바를 선택하거나
이니셜 상태바를 선택하더라도
에러를 피할 수 있다.


해결방안

결론 : 비주얼 C++ 6.0은 서비스팩을 설치하지 않으면 버그로 이런 에러가 발생한다.
최신 서비스팩을 설치하면 문제가 해결되지만, 찾고 어쩌고 할 시간이 없으시다면
다음의 코드를 추가하면 된다.

클래스위자드 실행 (Ctrl+W)
Class Name을 CMainFrame으로 두고 Messages에 WM_CREATE를 추가한다
추가후 MainFrm.cpp 파일의 OnCreate합수가 다음이 되도록 코딩한다

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
 if (CFrameWnd::OnCreate(lpCreateStruct) == -1)
  return -1;
 
 if(!m_wndView.Create(NULL, NULL, AFX_WS_DEFAULT_VIEW,
  CRect(0,0,0,0), this, AFX_IDW_PANE_FIRST, NULL))
 {
  TRACE("Failed to create view window\n");
  return -1;
 }
 return 0;
}


다시 컴파일하면, 문제가 해결된 것을 볼 수 있다.

'프로그래밍 > MFC' 카테고리의 다른 글

MFC :: 키보드 입력 관련  (0) 2011.09.12
한글 입력 관련 윈도우 메시지  (0) 2011.09.12
MFC :: MFC 에서 RTTI 구현 원리  (0) 2011.08.28
MFC :: ASSERT_VALID 매크로  (0) 2011.08.28
Visual C++ DLL (Dynamic Link Library)  (0) 2011.08.18
댓글 로드 중…

최근에 게시된 글