이 영역을 누르면 첫 페이지로 이동
웬디의 기묘한 이야기 블로그의 첫 페이지로 이동

웬디의 기묘한 이야기

페이지 맨 위로 올라가기

웬디의 기묘한 이야기

C/C++ Windows Hooking 개발자의 블로그 입니다! 이곳은 개발 외에도 저의 취미들이 공유되는 기묘한 이야기가 펼쳐집니다.

[MFC] 다이얼로그의 윈도우 소멸자 호출 순서

  • 2019.07.28 01:15
  • ⌨ DEVELOPMENT/C++
반응형

MFC Dialog 종료 소멸 순서 정리

최근 MFC 개발을 하다보니 소멸 순서에 대해 확인할 필요가 있어져서 확인 후 정리합니다.

 

모든 객체는 생성을 했으면 소멸을 해주어야하는게 당연합니다. 포인터의 경우엔 스마트 포인터를 이용하고, Lock Object는 RAII 패턴을 통해 Auto Lock을 사용하게 됩니다.

 

Dialog based 로 개발을 하다보면 Thread를 통해 UI Control에 접근을 하여 특정 상황에 UI를 변경하는 작업을 하게 되는데, 이때 해당 Thread를 소멸자에서 제거하게 되면 UI Control.m_hwnd 가 nullptr이 되어 매번 여러 상황에서 체크를 해야 하는 상황이 발생할 수 있습니다.

그렇기 때문에 Dialog::~Dialog 소멸자가 아닌 WIndow Control이 소멸되기 전에 Thread를 먼저 Stop 처리해주어야 Thread에서 UI Control시 문제가 발생하지 않고 정상 처리할 수 있게 됩니다.

MFC Project 생성

 

//
// X 버튼을 눌러서 다이얼로그를 종료한경우
//

OnSysCommand start
    OnClose
OnSysCommand end
DestroyWindow start
    OnDestroy
DestroyWindow end
OnNcDestroy start
    PostNcDestroy
OnNcDestroy end


//
// EndDialog, OnOk, OnCance 등을 이용하여 다이얼로그를 종료한경우
//

DestroyWindow start
    OnDestroy
DestroyWindow end
OnNcDestroy start
    PostNcDestroy
OnNcDestroy end

항상 위처럼 동작할것같지만 OnSysCommand -> OnClose 동작이 일어나지 않는경우도 있습니다.

다이얼로그를 종료할 때 X 버튼을 누른경우 OnSysCommand에 SC_CLOSE가 발생하게되며, 내부적으로 WM_CLOSE (OnClose)가 발생하게되지만, EndDialog, OnOK, OnCancel 등을 이용하여 다이얼로그가 종료된경우엔 OnClose 이벤트가 발생하지 않고 바로 DestroyWindow가 호출되어 다이얼로그가 파괴되게 됩니다.

 

OnClose

MFC Application을 종료시키는 시점에 호출되게 됩니다. X 버튼 또는 WM_CLOSE 증 실제 종료할때만 호출되며 EndDialog, OnOk, OnCancel 등 다른방식으로 다이얼로그가 종료되는경우엔 호출되지 않습니다.
 

DestroyWindow

MFC 다이얼로그가 종료되는 모든 시점에 호출됩니다. 단, Modeless Dialog는 소멸시 직접 DestroyWindow를 호출해주어야 합니다.

  • CWnd 내부에 있는 윈도우를 Destroy 합니다.
  • 윈도우를 해제하기 위해 윈도우에 여러가지 Message를 전달합니다.
  • 윈도우 메뉴 제거
  • Message Queue를 비운다.
  • Timer를 비운다.
  • Clipboard의 Owner를 제거한다.
  • Destory CWnd의 Clipboard Chain을 제거
  • 다만 아직 CWnd 객체 자체는 아직 Destroy 되지 않습니다.
BOOL CmfctestDlg::DestroyWindow()
{
    // UI 사용 Thread Stop

    return CDialogEx::DestroyWindow();
}

DestroyWindow 호출 시점이 다음과 같기때문에 먼저 window handle 등을 사용하는 Thread 등을 모두 해당 시점에 해제할 수 있습니다.

반응형

'⌨ DEVELOPMENT > C++' 카테고리의 다른 글

[MFC] Dialog based - class name 지정하는 간단한 방법  (3) 2019.09.08
[C++] Boost ASIO를 이용한 안전한 TCP/IP 비동기 소켓 서버 예제  (5) 2019.08.07
[MFC] Dialog Load GIF image  (5) 2019.07.28
[C++] How to use GDIPlus Library in c++  (0) 2019.07.28
[C/C++] string wstring format 사용하기  (1) 2019.07.27
[C/C++] 윈도우10 Boost 최신버전 설치 및 사용법  (13) 2019.07.27
[C/C++] URL 전달을 위한 urlencode & urldecode  (1) 2019.07.11
[C/C++] process crash 로그 및 덤프 남기기 (access violation)  (0) 2019.07.06

댓글

이 글 공유하기

  • 구독하기

    구독하기

  • 카카오톡

    카카오톡

  • 라인

    라인

  • 트위터

    트위터

  • Facebook

    Facebook

  • 카카오스토리

    카카오스토리

  • 밴드

    밴드

  • 네이버 블로그

    네이버 블로그

  • Pocket

    Pocket

  • Evernote

    Evernote

다른 글

  • [MFC] Dialog Load GIF image

    [MFC] Dialog Load GIF image

    2019.07.28
  • [C++] How to use GDIPlus Library in c++

    [C++] How to use GDIPlus Library in c++

    2019.07.28
  • [C/C++] string wstring format 사용하기

    [C/C++] string wstring format 사용하기

    2019.07.27
  • [C/C++] 윈도우10 Boost 최신버전 설치 및 사용법

    [C/C++] 윈도우10 Boost 최신버전 설치 및 사용법

    2019.07.27
다른 글 더 둘러보기

정보

웬디의 기묘한 이야기 블로그의 첫 페이지로 이동

웬디의 기묘한 이야기

  • 웬디의 기묘한 이야기의 첫 페이지로 이동

검색

메뉴

  • 홈
  • 태그
  • 방명록
  • 이야기

카테고리

  • 분류 전체보기 (204)
    • MY STORY (2)
    • 📸 WALKING WITH YOU (85)
      • 아이슬란드 신혼여행 이야기 (14)
      • 대한민국 구석구석 (62)
      • CONTAX N1 + T* 28-80mm (4)
      • SAMSUNG NX3000 (1)
      • 어느 멋진 날 (4)
    • ⌨ DEVELOPMENT (80)
      • BOOK:Review (1)
      • AI (13)
      • C++ (26)
      • Python (10)
      • WIndows Hooking (9)
      • Windows Kernel (3)
      • Design Pattern (3)
      • Debugging (9)
      • Tools (0)
      • Project (1)
      • Android (1)
      • 상업용 무료폰트 (4)
    • OS (4)
      • News (0)
      • Windows 일반 (4)
    • 모바일 (2)
      • 모바일 게임 (2)
    • 멘사 퍼즐 (9)
    • 생활 꿀 TIP (7)
      • 건강 (3)
      • 일상 (2)
    • 물생활 (8)
      • 골든볼 라미네지 롱핀 (8)
    • IT 기기 (2)
    • BLOG (4)
      • TISTORY BLOG TIP (3)

최근 글

인기 글

댓글

공지사항

아카이브

태그

  • AI
  • 아이슬란드
  • 해외여행
  • 카페
  • c++
  • c
  • 신혼여행
  • windbg

나의 외부 링크

  • kernel undocument api
  • 지구 관찰자의 일기
  • 지구와 지구곰

정보

WENDYS의 웬디의 기묘한 이야기

웬디의 기묘한 이야기

WENDYS

블로그 구독하기

  • 구독하기
  • RSS 피드

방문자

  • 전체 방문자
  • 오늘
  • 어제

티스토리

  • 티스토리 홈
  • 이 블로그 관리하기
  • 글쓰기
Powered by Tistory / Kakao. © WENDYS. Designed by Fraccino.

티스토리툴바