2008년 09월 29일
충격 AfxGetMainWnd() 함수
전에 Visual Studio 6.0 으로 작성하던 mfc 프로그램을 Visual Studio 2008 로 변환을 하였다.
보안이 강화됐는지 어쨌는지.. 수없이 많은 wanning 이 뜨고.. 젠장..
사용하지 말기를 권고하는 함수들에 대해서 안전한 함수로 교체를 하였다..
이거야 내 전문인 복사 컨트롤+V 이니.. 별 어려움이 없었는데..
MFC 6.0 으로 컴파일을 하면 분명히 실행이 되는 코드가 2008 에서 컴파일 하니 조낸 안되는 거였다.
디버깅을 해보니 범인은 AfxGetMainWnd() 함수
MFC 에서 윈도우간 통신을 위하여 저런 함수는 많이 사용되고 있는데.. 저 함수가 실행될때마다 다른 주소가
리턴이 되는걸 발견했다. 그것도 접근할 수 없는 영역의 주소를.. 뭥미..
나의 사부인 네이버형과 데브피아누나한테 물어본 결과....
다음과 같은 결론을 내렸다.
쓰레드(내에서 호출하는 함수)안에서.. AfxGetMainWnd() 를 쓰면 안된다. 그것도.. 6.0 은 되는데 .NET 이후버젼부터는 안된다.
어떤분이 가볍게 정리해 놓은 듯한 글은 다음과 같다.
라고는 하나.. 사실 이해간 안간다.. MainWnd가 여러개 있는것도 아니고.. 하나 있는건데
왜 그런건지.. 또 6.0 은 되는데 200X는 왜 안되는거냐고.. 모르겠다.. 난 아직도 좆밥인가보다..
해결방법::
AfxGetMainWnd() 대신 AfxGetApp()->GetMainWnd() 라고 쓰면된다.
보안이 강화됐는지 어쨌는지.. 수없이 많은 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() 라고 쓰면된다.
이 글과 관련있는 글을 자동검색한 결과입니다 [?]
- FNT-1175 Visual Stdio를 구입하려고 합니다 by Cailia
- 소스 코드 복사 발견하기 by monaca
- [C 문법] extern "C" 에 대하여.. by 민돌
- Unicode 문자열의 TRACE by 우하하
- VC++ 2008 얼마나 달라졌나.. by 미친병아리
# by | 2008/09/29 17:59 | { Codez } | 트랙백(1) | 덧글(3)





☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]
제목 : AfxGetMainWnd()
출처는 이곳 !! http://xuny.egloos.com/tb/2078275 전에 Visual Studio 6.0 으로 작성하던 mfc 프로그램을 Visual Studio 2008 로 변환을 하였다.보안이 강화됐는지 어쨌는지.. 수없이 많은 wanning 이 뜨고.. 젠장..사용하지 말기를 권고하는 함수들에 대해서 안전한 함수로 교체를 하였다..이거...more
이거 몰라서 졸라 짜증났었는데....
덕분에 쉽게 알게 됬네요..
이래서 MFC 정말 하기 싫으네요 ㅜㅜ