MFC

윈도우 프로시저에서 메시지 박스를 띄울 때 런타임 에러가 발생하는 이유

FreeChild 2010. 4. 3. 14:24


다음의 예제를 한번 살펴 봅시다.

--------------------------------------------------------------------------------

LRESULT CMainFrame::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{

 ① MessageBox( _T("error"), _T("error"), MB_OK ); // 여기서는 런타임에러가 난다. 

    switch( message )
    {
        case WM_NCLBUTTONDOWN :
            // 여기서는 에러없이 잘된다.
         ② MessageBox( _T("success"), _T("success"), MB_OK );
            break;

        .......
    }
}

--------------------------------------------------------------------------------


1번과 2번은 어떤 차이가 있을까요?

WindowProc()이 호출될 시점을 생각해 봅시다. 당연히 모든 이벤트가 발생할 때마다

WindowProc()가 호출되겠지요. 그중에서도 최초 CMainFrame 클래스의 윈도우를 생성

중인 시점이라면 WM_CREATE 메시지가 발생합니다. WM_CREATE 메시지는 윈도우를 만들

고 있는중에 처리할 수 있는 메시지입니다. 문제의 핵심은 이것입니다. 윈도우가 아직

만들어진 상태가 아니라는 점입니다. 부모 윈도우인 CMainFrame 윈도우가 아직 만들어

지지 않았기 때문에 부모 윈도우(CMainFrame)의 핸들값이 유효하지 않습니다. 그 유효

하지 않은 핸들값을 참조하는 일종의 자식 윈도우인 MessageBox()가 부모 윈도우의 핸

들값을 참조하기 때문에 런타임에 에러가 발생하는 것입니다. (MFC의 MessageBox()는

내부적으로 부모 윈도우의 핸들을 참조합니다) switch()문 밖에 있는 MessageBox()와

특정한 메시지에 위치한 MessageBox()는 그러한 차이가 있습니다. 제가 이렇게 확신해서

말씀드릴 수 있는 이유가 만약에 우리가 원하는 의도대로 MessageBox()가 호출될 수 있

다면 정신없이 무수히 많은 메시지 박스가 팝업될텐데 WM_CREATE 메시지를 처리하기전에

그런 경우는 절대 발생할 수 없기 때문입니다.

Written By Sim-Hyeon, Choe