2013년 9월 29일 일요일

[MFC] MFC에서 UI Thread를 이용한 Dialog 호출 방법

==========================================================
출처 :
 http://blog.naver.com/PostView.nhn?blogId=aladdin07&logNo=150074142378&categoryNo=8&viewDate=&currentPage=1&listtype=0
==========================================================

1.목적
메인 프로그램에서 메뉴 항목을 선택하면 별도의 Dialog가 생성되어 거기서 정보를 입력 받는다.
단, 메인프로그램과 생성된 Dialog는 상호 독립적으로 구동되어야 한다.
(즉, 메인프로그램에서 DoModal()로 Dialog를 구동시키지 않고 별도 Thread로 구동 시켜야 한다)

2.방법
CWinThread Class를 활용한다.

① Class Wizard를 사용하여 CWinThread를 Base Class로하는 Class(CDlgThread)를 정의한다.
    Header File(DlgThread.h)에는 'DECLARE_DYNCREATE(CDlgThread);'
    Source File(DlgThread.cpp)에는 'IMPLEMENT_DYNCREATE(CDlgThread ,CWinThread)'
    ClassWizard에 의해 자동으로 추가됩니다.

DlgThread.h를 수정한다.
    - protected로 정의된 Constructor DlgThread()와 Deconstructor ~DlgThread()를 public으로
      바꾸어 준다. (이유는 해보면 안다)

      public:
           DlgThread();
           ~DlgThread();

③ Dialog 변수를 정의 한다.
    public:
         CDialog* m_pDlg;

④ CDlgThread의 InitInstance()에서 다음과 같이 독립실행 시킬 Dialog(CMyDlg)를 생성한다.
    이 작업은 Thread에 Dialog를 Binding 시키는 과정이다.
    BOOL CDlgThread::InitInstance()
    {
        m_pDlg = new CMyDlg();
        m_pDlg->ShowWindow( SW_SHOW );
        m_pDlg->UpdateWindow();
        return TRUE;
    }

⑤ CMyDlg Class의 Constructor를 수정한다.
    CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/)
         : CDialog(CMyDlg::IDD, pParent)
    {
        Create( IDD_MyDlg );    <== 요놈 추가
        //{{AFX_DATA_INIT(CDlgClub)
        // NOTE: the ClassWizard will add member initialization here
        //}}AFX_DATA_INIT
    }

⑥ 필요한 곳에서 다음과 같이하여 Thread를 구동 시키면 된다.

    CDlgThread*  m_pThread = new CDlgThread();
    m_pThread->CreateThread();

※ 상기와 같이하면 UI Thread를 구현할 수 있다..간단하죠~~잉..?
    위와 같이 구동된 Thread Dialog는 OK, CANCEL 버튼을 눌러도 소멸되지 않습니다.
    단지 HIDE 상태로 되는 거죠..
    따라서, 명시적으로 Thread Dialog를 죽이지 않았다면..메인 프로그램이 끝날때까지 Thread로
    남아 있게되는 거죠....요놈을 다시 사용하고 싶을때는 다음 두 줄로 다시 나타나게 만들면 된다.
    m_pThread->m_pDlg->ShowWindow( SW_SHOW );
    m_pThread->m_pDlg->UpdateWindow();
   
※ 명시적으로 Thread Dialog를 종료시킬려면 간단하다.
    Thread Dialog에 WM_QUIT Message를 보내면 된다.
    어떻게..?  PostThreadMessage()를 사용하면 된다.

    m_pThread->PostThreadMessage(WM_QUIT,0,0);

2013년 9월 28일 토요일

[WINPCAP] MFC로 pcap_findalldevs() 함수를 사용했는데 글자가 깨질때

========================================================
출처 : https://kldp.org/node/105221
========================================================












MFC에서 pcap_findalldevs()를 사용했는데 글자가 깨지는건 pcap_findalldevs() 함수가 사용하는 구조체 pcap_if가 가진 변수 name이 '유니코드'가 아닌 '멀티바이트' 형태로 저장하는데 현재 프로젝트가 유니코드로 설정 되어있어서라고 한다.




















위의 그림과 같이 '멀티바이트 문자 집합 사용'으로 바꾸면 아래와 같이
정상적으로 실행된다.



spring에서 mariadb로 연동후 웹에서 접근시 jdbc 오류가 발생할때

* 본문은 [코드로 배우는 스프링 웹 프로젝트, 구멍가게 코딩단 지음] 도서를 공부하면서 정리한 글임을 밝힙니다.