336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.
ATL 프로젝트에서 hWnd사용하기
문제 상황 :
ATL 프로젝트에서
소켓 통신을 위한 쓰레드를 만들어 사용하다
소켓 통신 도중 특정 메시지 수신시
ATL 이벤트를 발생 시키고 싶었다.
------요약-----------
Worker Thread 에서 ATL event(Fire_xxxx) 실행
직접 Fire 함수를 실행시 Invoke 부분에서
E_UNEXPECTED Catastrophic failure. 를 리턴한다.
Worker Thread 에서 ATl main Thread 의 함수를 실행하여 그런것 같다.
SendMessage 나 PostMessage 로 Main Thread 가 실행하도록 메시지를 주는 방법을 찾던 도중
SendMessage가 hWnd 를 이용하여 타 쓰레드간 메시지를 주고 받을수 있다는 점을 활용하였다.
하지만 기본 ATL 객체는 hWnd 를 갖고 있지 않다.
생성자 호출 시
상속 받은 m_bWindowOnly 변수를 TRUE 로 초기화하면
m_bWindowOnly = TRUE;
상속 받은 m_hWndCD 를 사용 할 수 있다.
m_hWndCD를 활용하여 WorkerThread 에서
메인 쓰레드로 메세지를 준다.
::SendMessage(pHelloCtrl->m_hWndCD, WM_xxx, (WPARAM)NULL, (LPARAM)NULL);
추가-------
혹시나 메인 쓰레드에서 메세지를 받는 방법을 모르는 사람이 있을까 싶어서 추가합니다.
일반 MFC 는 이런 메세지 맵을 갖고 있는데
BEGIN_MESSAGE_MAP(CMFCApplication2Dlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1, &CMFCApplication2Dlg::OnBnClickedButton1)
END_MESSAGE_MAP()
ATL 프로젝트는
BEGIN_MSG_MAP(xxxxxx)
MESSAGE_HANDLER(WM_CODE_START, OnSTART)
MESSAGE_HANDLER(WM_CODE_STOP, OnSTOP)
CHAIN_MSG_MAP(CComControl<xxxxxxxx>)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
이런 메세지 맵을 갖고 있습니다.
여기에 SendMessage 로 받을 메세지를 선언하고 그 때 실행할 함수를 위치시키면 됩니다.