[완료]Winapi의 Wndproc가 function pointer로 호출되는 이유는 무엇일까요?
winapi32 의 hello world 출력예제 코드를 보면,
MyRegisterClass함수에서 wcex.lpfnWndProc=(WNDPROC)WndProc; callback Wndproc를 함수포인터로 등록합니다.
어플을 실행시키고 winmain에서 loop를 도는 getmessage가 메시지를 핸들링 하고
결국 내부적으로 message structure의 각 멤버변수를 등록된 callback Wndproc의 인자값으로 넣어서 호출합니다.
그런데 여기서 생기는 제 궁금중이
mesasge struct안에는 destination을 결정하는 변수가 2개 있습니다.
message id와 handle이죠.
허나 현재 작동중인 win xp os는 hello world 어플말고 여러 Wndproc가 호출되어 있을것이고
message id와 handle만으로 메시지를 전달할 Proc를 구분하기 위해서는 별도의 매커니즘이 필요할 것 입니다.
고로 Winapi32의 아키텍쳐를 만들던 사람들은 c언어의 함수포인팅을 이용해 이런한 Callback 메커니즘을 구현하고,
이에 맞춰 적절히 메시지를 핸들링 하고 있다고 생각합니다.
정리해서 질문드리자면, 함수포인터를 이용해서 Wndproc를 등록하는 이유자체가
Event Message를 전달하기 위한 일종의 편법의 범주에서 효율적인 방안이라고 유추하게 되었는데
어떻게 생각하시는지요?
저는 Winapi32를 Hello world 만 공부해본 사람입니다.
프로젝트가 Win32에서 작업을 해서 지금 공부하고 있는데 갑자기 의문이 드는군요.
많은 조언 부탁드립니다.
합당한 답변인지는 모르겠지만,
windows procedure를 등록하는 것은
현 process에 대한 무언가라기 보다는
내가 지금 등록한 (말씀하시는 경우에서는 main window가 되겠죠) window에 대한
message를 받겠다는 거거든요.
가령, 마우스로 화면상에 click을 했다고 칠때,
그 위치에 님이 만든 어플리케이션의 button이 있었다면,
GUI system은 마우스 click위치에 대해서, hotspot check를 해서
해당 위치에 있는 window의 handle을 얻어내고요.
그 window로 button down이든 뭐든 보내겠죠.
그 윈도우를 생성하고 또, getmessage 등으로 님이 만든 app가
그 윈도우의 메시지를 얻어오려고 하고 있으니까,
그게 님의 process내에서 진행이 되는 것입니다.
....
결론은
메시지라는 것은 window에 대해서 주고 받는 것이지,
process에 대해서 주고 받는 것이 아니라는 것입니다.
댓글 달기