어느날... DLL의 특정 함수에서 DLL리소스에 있는 다이얼로그를 모달로 띄우려 하는데...

생성이 안되는 것이 아닌가...왜 그런가 찾아 봤더니 글쎄...ㅡㅡ;;

다이얼로그 생성시 넘겨주는 핸들이 잘못되었지 뭐야...

생성하려는 다이얼로그가 위치한곳의 핸들이 필요하더군...

EXE의 다이얼로그라면 EXE의 HINSTANCE가 필요하고 DLL의 다이얼로그라면 DLL의 HINSTANCE가 필요하지...

EXE의 HINSTANCE는 WinMain()에 들어오는 것이고...

DLL의 HINSTANCE는 DllMain()에 들어오는 것이지...


일단 요렇게 해서 전역변수에 dll의 핸들을 저장하고...


BOOL APIENTRY DllMain( HANDLE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved )
{
    switch ( ul_reason_for_call )
    {
    case DLL_PROCESS_ATTACH:
        g_hDll = hModule;
       break;
    }

 

    return TRUE;
}

 

전역 함수로 어디서든 가져다 쓸수 있게 한다..


HANDLE GetDllHandle()
{
    return g_hDll;
}


그리고나서 다이얼로그를 생성할때 첫번째 인자인 HINSTANCE를 저장해둔 넘으러 넘겨준다...


int CDialog::DoModal()
{
    return (int) ::DialogBoxParam( (HINSTANCE) GetDllHandle(), MAKEINTRESOURCE( m_nTemplateName ), m_hParentWnd, CDialog::__cbDlgProc, (LPARAM) this );
}


요렇게 하믄 다이얼로그가 정상적으로 뜬다~

보너스로 MFC에서는 아래와 같이 쓰면 된다~


AFX_MANAGE_STATE(AfxGetStaticModuleState( ));
CDialog dlg;

dlg.DoModal();


이건 여담인데...저렇게 하니깐 다이얼로그가 뜨긴 뜨는데 이상하게 타이틀바나 배경이 안그려 지더군...

왜그런가 했더니 DlgProc에서 기본적으로 false를 리턴해야 시스템에서 처리를 하는데 무조건 true를 넘기니...

시스템이 삐쳐서 안그려주더군...제길...

출처 : Tong - sponge9님의 윈도우즈통

크리에이티브 커먼즈 라이선스
Creative Commons License

Tag :

« PREV : 1 : ... 36 : 37 : 38 : 39 : 40 : 41 : 42 : 43 : 44 : ... 85 : NEXT »