C/C++/aaa

AFX_MANAGE_STATE(AfxGetStaticModuleState())

김컴맹 2012. 3. 11. 01:53
반응형

AFX_MANAGE_STATE(AfxGetStaticModuleState());

MFC 모듈의 상태 데이터 관리하기


1.요약

우선 이 글의 제목이 이와같이 어색한 이유는 'Managing the State Data of MFC Modules'라는 영문 제목을 쑥스럽게도 번역했기 때문이며, 이와같이 난감한 제목에도 불구하고 초급 게시판에 오른 이유는 그 내부원리를 설명하는 것이 아니기 때문입니다.

MFC를 사용해서 Dll을 만드시는 분이라면 반드시 알아야 할 부분이므로 꼭 읽어주시기 바랍니다.

2.본문

이 글에서 알리고자 하는 것은

AFX_MANAGE_STATE( ::AfxGetStaticModuleState() ); 
를 반드시 넣자!! 라는 것이며 이것이 전부입니다.

그럼 이것을 어디에 반드시 넣어야 하는지 알아보기 위해서 왜 이것을 넣어야 하는지부터 알아보겠습니다.

사건은 MFC가 모듈별로 정보를 관리한데는 점에서 시작됩니다. 모듈이란 각각의 exe, dll 들을 말하며 개별적으로 관리되는 정보에는 윈도우즈 인스턴스 핸들(리소스 로딩시에 사용), CWinApp와 CWinThread 객체들의 포인터, OLE 모듈 참조 카운트, 윈도우 객체 핸들과 그에 대응되는 MFC 객체 인스턴스간의 맵들.. 등이 있다고 합니다.

그러므로 올바른 모듈에서 올바른 정보를 사용할 수 있도록 해 줄 필요가 있는 것이며, 위에 써 넣은 한 줄..

이 코드가 바로 그 역할을 합니다.

요약해서 말하자면, 제어의 흐름이 모듈에서 다른 모듈로 넘어갈 때,(예를 들어 exe내의 함수에서 dll내의 함수를 호출했을 경우) 위와 같은 코드를 실행해 줌으로써 자신(dll)의 정보를 활성화 시켜주게 되는 것이죠. 함수가 끝나면 자동으로 이전의 정보가 활성화 됩니다.( 스택의 힘이겠죠!!)

그러므로 다음과 같은 곳에서 꼭 위의 코드를 넣어주신다면 여러분은 행복해질 수 있습니다.

. 외부로 익스포트된 Dll의 함수
. COM 인터페이스의 멤버 함수
. 윈도우 프로시져

우선 외부로 익스포트된 Dll 내의 함수. 이는 외부 모듈에서 호출할 수 있다는 의미이고 반드시 함수의 맨 앞에 위의 코드를 넣어주셔야 합니다.

다음 COM 인터페이스의 멤버 함수. 이는 직접 외부로 익스포트되는 것은 아니지만 이러저러한 경로를 통해서 인터페이스는 다른 모듈에 공개될 것이며 그에따라 멤버 함수 역시 다른 모듈에서 호출될 것입니다. 하지만 여러분이 MFC를 사용해서 COM 객체를 만들었다면 따로 해줄 일은 없습니다.

왜냐면 MFC를 사용해서 COM 객체를 만드는 경우라면 여러분의 메소드 구현시에 꼬박꼬박 METHOD_PROLOGUE 라는 매크로를 사용해야만 하며 그 매크로 속에는 이미 위의 코드가 포함되어 있기 때문입니다.

마지막으로 윈도우 프로시져. 이 역시 MFC를 사용해서 윈도우를 만드셨다면 굳이 해주실 일은 없습니다. 이는 이미 MFC내부에서 위의 코드를 사용한 후에 AfxWndProc를 호출하고, 여기서는 또 적당한 CWnd-파생 객체의 WindowProc를 호출하기 때문입니다.

결론은 MFC에서 안해줬을 법한데서만 해주시면 되는겁니다.

끝으로 이러한 일을 하지 않았을 경우, dll에 있는 리소스를 로드하려고 했는데 exe에 있는 리소스가 로드된다던지 하는 문제가 생기겠죠. 여태까지 이런 거 안해줘도 잘 쓰셨다는 분은 exe 역시 MFC로 만드셨을 가능성이 높고 운좋게도 충돌이 일어나지 않으셨을 겁니다.


참고

MSDN 에서 다음을 찾으세요.

Managing the State Data of MFC Modules.
TN058: MFC Module State Implementation. 


출처 : http://www.debuglab.com/knowledge/mfcmodule.html

반응형

'C/C++ > aaa' 카테고리의 다른 글

ActiveX CLSID 변경  (0) 2012.03.22
ZeroMemory, memset  (0) 2012.03.12
isNaN() , finite()  (0) 2012.02.28
[ MFC ] #ifdef _DEBUG  (0) 2012.02.24
[ MFC ] 해당 컨트롤의 위치(좌표) 구하기 _ GetWindowPlacement()  (0) 2012.02.24