Tips2021. 3. 31. 14:56

Win32/MFC 다이얼로그(dialog) 기반 프로그래밍 시 다양한 용도로 활용하기 위해 CLASS를 별도로 등록해서 쓰는 경우가 있다. 예를 들어,

#define MYCLASSNAME L"RandMP3"


CNormalGUIDlg::CNormalGUIDlg(CWnd* pParent /*=NULL*/)
	: CDialogEx(CNormalGUIDlg::IDD, pParent)
{
	...    
	WNDCLASS wc = {};
	::GetClassInfo(AfxGetInstanceHandle(), L"#32770", &wc);
	wc.lpszClassName = MYCLASSNAME;
	AfxRegisterClass(&wc);
    ...
}

 

이런 식으로 등록을 해두면 FindWindow 류를 손쉽게 활용할 수 있다.

 

그런데 DoModal이나 Create, CreateDlgIndirect 등을 호출하면 갑자기  ERROR_CANNOT_FIND_WND_CLASS [1407(0x57F)] 를 맞는 경우가 생긴다. (GetLastError로 확인)

 

여러가지 이유가 있을 수 있는데, 여기서는 그 중 한가지를 짚어 본다.

프로젝트 폴더의 .rc 확장자 파일을 텍스트 에디트 모드로 연다. 그 다음 CLASS 라는 항목을 찾아 본다. 아래의 예와 같이 나올 것이다. 없다면 해당 DLG 코드에 삽입하자.

...
IDD_NORMALGUI_DIALOG DIALOGEX 0, 0, 306, 148
STYLE DS_SETFONT | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_APPWINDOW
CAPTION "RandMP3"
CLASS "NewRandMP3"
...

 

위와 같이 내가 등록한 CLASS명(RandMP3)과 RC 파일의 CLASS명(NewRandMP3)이 상이한 경우 위의 에러를 맞을 수 있다.

통일해서 저장을 한후 rebuild를 하면 문제없이 실행되는 것을 확인할 수 있다.

 

Posted by JMAN