(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;
}
다시 컴파일하면, 문제가 해결된 것을 볼 수 있다.