sysmac.h 에 macro 정의가 다음과 같이 되어 있습니다.
#define BEGIN_MESSAGE_MAP virtual void __fastcall Dispatch(void *Message) \ { \ switch (((PMessage)Message)->Msg) \ {
#define VCL_MESSAGE_HANDLER(msg,type,meth) \ case msg: \ meth(*((type *)Message)); \ break;
#define END_MESSAGE_MAP(base) default: \ base::Dispatch(Message); \ break; \ } \ } 보시면 아시겠지만 Dispatch 함수와 switch - case 문을 macro 형태로 만든 것입니다. OnWMNCActivate 함수에서 Dispatch 함수를 호출하는 것은 결국 자기 자신을 호출하는 재귀호출이 됩니다. 함수를 호출하면 인수와 복귀주소를 스택에 저장합니다. 계속 호출하면 스택이 넘치는 stack overflow 가 발생합니다. END_MESSAGE_MAP 에서는 상위 class 의 Dispatch 함수를 호출합니다. 즉, inherited 와 같습니다. 따라서 메시지 핸들러에서 Dispatch 함수를 호출하지 마시고 메시지가 왔을 때 처리해야 하는 일을 쓰면 됩니다. |