윈도우즈 프로그램의 기본적인 실행 구조는 다음과 같다.

실행 파일을 실행 시키면 하나의 프로세스가 생성 된다.
프로세스는 단독으로 수행될 수 없고 스레드에 의해 수행된다.
스레드는 프로세스의 메모리 공간(가상 주소 공간) 을 수행할 책임을 갖게 된다.
프로세스는 하나 이상의 스레드를 갖으며, 최초의 스레드를 Primary Thread 라고 부른다.

MFC로 만든 응용프로그램 역시 윈도우즈 프로그램이므로, 하나 이상의 스레드를 갖는다.
Primary Thread 역할을 하는 것은 CWinApp 클래스의 파생 클래스인 CXXApp 클래스가 스레드를 생성한다.
자세히 말하면 MFC 응용프로그램의 유일한 전역 객체인 CxxApp의 객체가 진입점 함수(WinMain, wWinMain) 함수를
실행시키게 된다. (진입점 함수는 C/C++ 런타임 시작함수가 호출 한다.)


■ AfxGetApp()
AfxGetApp() 전역 함수를 호출하게 되면 MFC 응용프로그램의 최초에 생성된 스레드의 app 를 반환해 준다.
반환 타입이 CWinApp * 이므로 사용할때는 자신이 사용할 타입으로 적절히 타입 캐스팅 해주어야 한다.

 메인 스레드의 메인 윈도우 객체 포인터를 얻기 위해선
::AfxGetApp()->m_pMainWnd;
와 같이 m_pMainWnd 멤버 변수 값을 참조 하면 된다.
또는
::AfxGetApp()->GetMainWnd();
멤버 함수를 호출하여 값을 얻을 수도 있다.


■ AfxGetMainWnd()
 AfxGetMainWnd()  MFC 전역 함수는 현재 스레드의 메인 윈도우 핸들을 리턴한다.
단일 스레드 프로그램의 경우 ::AfxGetApp()->GetMainWnd();  와 같은 결과를 얻을 수 있다.
하지만 멀티 스레드 프로그램일 경우에는 주의해서 사용 해야 한다.
AfxGetMainWnd() 의 원형은 다음과 같다.

_AFXWIN_INLINE CWnd *AFXAPI AfxGetMainWnd()
{
    CWinThread *pThread = AfxGetThread();
    return pThread != NULL ? pThread->GetMainWnd() : NULL;
}


리턴값을 보면 현재 스레드의 메인 윈도우를 리턴한다.
따라서 다른 쓰레드에서 AfxGetMainWnd() 함수를 사용하면 다른 윈도우 핸들을 리턴할 가능성이 있다.

다른 스레드에서 메인 윈도우 핸들을 얻기 위해선
::AfxGetApp()->GetMainWnd();
함수를 사용하면 된다.


Posted by six605
,