본문 바로가기

Programming/MFC

충격 AfxGetMainWnd() 함수

출처 : http://egloos.zum.com/xuny/v/2078275


전에 Visual Studio 6.0 으로 작성하던 mfc 프로그램을 Visual Studio 2008 로 변환을 하였다.
보안이 강화됐는지 어쨌는지.. 수없이 많은 wanning 이 뜨고.. 젠장..
사용하지 말기를 권고하는 함수들에 대해서 안전한 함수로 교체를 하였다..
이거야 내 전문인 복사 컨트롤+V 이니.. 별 어려움이 없었는데..

MFC 6.0 으로 컴파일을 하면 분명히 실행이 되는 코드가 2008 에서 컴파일 하니 조낸 안되는 거였다.
디버깅을 해보니 범인은 AfxGetMainWnd() 함수

MFC 에서 윈도우간 통신을 위하여 저런 함수는 많이 사용되고 있는데.. 저 함수가 실행될때마다 다른 주소가
리턴이 되는걸 발견했다. 그것도 접근할 수 없는 영역의 주소를.. 뭥미..
나의 사부인 네이버형과 데브피아누나한테 물어본 결과....

다음과 같은 결론을 내렸다.
쓰레드(내에서 호출하는 함수)안에서.. AfxGetMainWnd() 를 쓰면 안된다. 그것도.. 6.0 은 되는데 .NET 이후버젼부터는 안된다.
어떤분이 가볍게 정리해 놓은 듯한 글은 다음과 같다.

다른 함수와는 달리 AfxGetMainWnd()함수는 스레드와 관련이 있어 주의하여야 한다.
이함수의 내부를 보면 다음과 같이 되어 있다.

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

내부에서 AfxGetThread()함수를 사용하는것을 볼수가 있다.
이것은 현재 스레드의 GetMainWnd()함수를 호출한다.
이것은 다른 스레드에서 메인 윈도우의 핸들이 필요할때는 문제가 된다.
즉 다른 스레드에서 다음과 같이 AfxGetMainWnd()함수를 호출하면 메인 윈도우의 핸들을 얻을수가 없게 된다.


라고는 하나.. 사실 이해간 안간다.. MainWnd가 여러개 있는것도 아니고.. 하나 있는건데
왜 그런건지.. 또 6.0 은 되는데 200X는 왜 안되는거냐고.. 모르겠다.. 난 아직도 좆밥인가보다..

해결방법::
AfxGetMainWnd() 대신 AfxGetApp()->GetMainWnd() 라고 쓰면된다.