dialog를 재정의해서 사용할 때,
불현듯 DoModal에서 ASSERT에 걸려서 실행을 못하는 경우가 있다.

■ ASSERT에 걸리는 부분 
---------------------------------------------------------------------------------
INT_PTR CDialog::DoModal()
{
// can be constructed with a resource template or InitModalIndirect
ASSERT(m_lpszTemplateName != NULL || m_hDialogTemplate != NULL ||
m_lpDialogTemplate != NULL);
--------------------------------------------------------------------------------- 

이경우 m_lpszTemplateName,  m_hDialogTemplate,  m_lpDialogTemplate 이 모두 NULL이다.

인터넷으로 뒤져보면 resource에 문제가 있으니, resource.h를 살펴보라는 둥 어쩌고 저쩌고 나오는데, 
결론적으로 리소스 문제인것은 명확하나 resource.h를 볼 필요는 없다.

원인은 의외로 기본적인 부분에 있으니..

■ 원인
Dialog를 상속만 받은 쌩짜 class(  BaseDialog 라 칭하자 )를 만들고, 기존에 사용하던 dialog class를 대체하면 빌드 에러가 날 것이다.

예)
 error C2661: 'BaseDialog::BaseDialog' : 오버로드된 함수에서 2개의 매개 변수를 사용하지 않습니다.

그렇다.  BaseDialog에는 UI Template ID와 parent포인터를 받아주는 생성자를 만들지 않아서 발생하는 에러다.
생성자를 정의해 주자.
BaseDialog::BaseDialog(UINT nIDTemplate, CWnd* pParent)
{
      .....

 
여기가 DoModal이 ASSERT를 발생 시키는 포인트다.

급하게 정의하느라 위 처럼 만들면, 의외로 삽질하느라 시간을 허비할 수도 있다.
뭔가 빠진게 있는거 같지 않은가?
 
답) 

BaseDialog::BaseDialog(UINT nIDTemplate, CWnd* pParent)
: CDialog( nIDTemplate,  pParent )
{
      .....
}  

그렇다. 멤버 이니셜라이징을 안 한것이다.
CDialog를 재정의하면서 CDialog에 TemplateID를 설정 안 해줬으니,
 m_lpszTemplateName,  m_hDialogTemplate,  m_lpDialogTemplate 이 모두  NULL인 상황이 되는 거다.

이니셜라이징을 해주면 문제 해결.

혹시나 이런 일로 시간을 허비하는 분들이 있을까봐 포스팅 합니다.


 
Posted by 아..몰라 ㅡ.ㅡ+
,