글 수 429
MFC 모달리스 창 처리할때 흔히 쓰는 방법대로
이렇게 써두고
헤더에다가
선언해서
요렇게 해서
종료할때
이렇게 먹여주면
필터 목록에서 추가 제거할때는 분명 잘 되는데,
필터를 넣어둔 상태에서 '프로그램을 닫아버리면'
오류가 나지 말입니다 =ㅅ=;;;;;
아니 왜 이러는거;;;
디버깅 찍었을때는
이미 CATPluginApp::OnPluginClose()들어온 시점에서 CDumpWindow가 삭제된 상태
-_-;;;;
+ 추가
8월차 MultiPlugin으로 테스트해보니
옵션창에다가 추가를 한뒤 닫는 순간에
이미 CDumpWindow가 종료되고 있더랍니다[....]
void CDumpWindow::PostNcDestroy() { delete this; CDialog::PostNcDestroy(); // TODO: 여기에 메시지 처리기 코드를 추가합니다. }
이렇게 써두고
헤더에다가
CDumpWindow *m_pDumpWindow[2];
선언해서
BOOL CATPluginApp::OnPluginInit(HWND hSettingWnd, LPSTR cszOptionStringBuffer) { g_hSettingWnd = hSettingWnd; g_szOptionStringBuffer=cszOptionStringBuffer; m_pDumpWindow[0] = new CDumpWindow; if(m_pDumpWindow[0]) { m_pDumpWindow[0]->Create(MAKEINTRESOURCE(IDD_DumpWindow),0); m_pDumpWindow[0]->ShowWindow(SW_SHOW); } return TRUE; }
요렇게 해서
종료할때
BOOL CATPluginApp::OnPluginClose() { // 주의: 여기서 메모리 확보 등을 하면 에러 발생. // TODO: 플러그인 종료 준비, 자원 반환 등을 한다. if(m_pDumpWindow[0]!=NULL) { m_pDumpWindow[0]->DestroyWindow(); m_pDumpWindow[0]=NULL; } if(m_pDumpWindow[1]!=NULL) { m_pDumpWindow[1]->DestroyWindow(); m_pDumpWindow[1]=NULL; } return TRUE; }
이렇게 먹여주면
필터 목록에서 추가 제거할때는 분명 잘 되는데,
필터를 넣어둔 상태에서 '프로그램을 닫아버리면'
오류가 나지 말입니다 =ㅅ=;;;;;
아니 왜 이러는거;;;
디버깅 찍었을때는
이미 CATPluginApp::OnPluginClose()들어온 시점에서 CDumpWindow가 삭제된 상태
-_-;;;;
뭥미
+ 추가
8월차 MultiPlugin으로 테스트해보니
옵션창에다가 추가를 한뒤 닫는 순간에
이미 CDumpWindow가 종료되고 있더랍니다[....]
한가지 방법이 있기는 한데.. DumpWindow 를 게임 윈도우의 자식으로 생성하는 겁니다. 이렇게 하면 게임이 죽을때 WM_DESTROY 를 자식 윈도우에게 뿌리기 때문에 에러없이 처리할 수 있습니다. 물론 게임은 켜져있지만 필터만 Unload 하는 경우에 대비해서 OnPluginClose 에서 IsWindow() 등으로 윈도우가 살아있는지 확인해서 살아있다면 적절한 처리를 해주는 것이 필요합니다.
참고로 게임 윈도우를 찾아내는 방식은.. ATCode 플러그인 소스 내의 Win32UIMgr 클래스를 참조하시기 바랍니다.