안녕하세요 백두루' ') 입니다

과연 윈도우즈에서 프로그램은 어떤 방식으로 작동을 할까요?
아래는 윈도우 프로그램의 기본구조(API) 입니다

int WINAPI WinMain(...)
{
//   1.윈도우 클래스 등록
//   2.윈도우 생성 및 보이기
//   3.메세지 루프 돌리기
}

LRESULT CALLBACK WndProc(...)
{
//   메세지처리
}

보통 크게보면 위와같은 두개의 함수를 윈도우 프로그램 작성시에 볼수있습니다
실행을 하면 WinMain() 에서 주석대로 명령을 수행합니다...
일단 운영체제 이름 대로 윈도우를 생성합니다

그리고 주의해서 보셔야 될곳이 3번인데....
윈도우즈는 메세지구동방식으로 작동 합니다(많이 들어보셨죠?)
즉 운영체제는 발생하는 메세지를 감지해서 모았다가 보내줘야할 프로그램으로 잘 보내줍니다
이렇게 운영체제와 프로그램이 서로 통신할 수 있게 해주는 메세지는 윈도우의 모든것이지요

(운영체제)시스템 메세지큐 ---> (프로그램)쓰레드 메세지큐로 이동된뒤에
3번에서 이 메세지를 끝없이 가져오는 루프를 실행합니다.
의문점은 도스였다면 이러한 무한루프는 CPU를 100%독점하게 될것입니다
하지만 윈도우즈는 다수의 프로그램이 잘 돌아가는것을 경험으로 알고 있습니다

이것은 설계때부터 멀티태스킹이 가능하도록 커널이 CPU를 사용할 수 있는 시간을
프로그램에게 잘 분배해주기 때문입니다.(다들 아시는얘기죠)

다음으로 메세지를 가져오면 그에 맞는 처리를 해야되는데
우리의 메세지루프에서는 DispatchMessage()라는 녀석이 보이는군요

dispatch <군대특사 등을> 급파[특파]하다; <급보를> 발송하다 ((to))

그렇습니다.메인함수아래 있던 WndProc() 라는 함수가 윈도우 프로시져 입니다
DispatchMessage() 는 윈도우 프로시져로 급하게 메세지를 발송합니다
즉 발생된 모든 메세지는 윈도우 프로시져에서 처리 하게 되어있습니다
WndProc() 내부구조도 switch~ case 구문으로 메세지별로 처리할수 있게 합니다.

하지만 중요한것은 우리는 메인함수에서 단 한번도 윈도우 프로시져를 호출하지
않았다는것 입니다.이상하지 않습니까?



하지만 이것은 지극히 정상이며 다른무엇이 윈도우 프로시져를
호출한다는것을 유추할 수 있습니다

여기서 나온 개념이 '콜백'인데 우리(WinMain내부에서)가 직접 호출하는것이
아니라 서비스 제공자 (OS)가 호출하는것이 입니다.
즉 WndProc() 는 뒤에서 불려서 열심히 삽질을 계속 하고 있죠...^^
//정확히 운영체제의 누가 호출하는것일까요?

또한 운영체제에서  어떻게 WnProc()의 호출 할수있을까요?
운영체제는 전지전능해서 모든것을 알고 있는걸까요?


그것은 이미 우리가
WNDCLASS의 멤버 lpfnWndProc에 다가 함수포인터주소를 넘겼기 때문이죠
함수포인터(콜백함수의 원리)는 대단한 기능인거 같군요
주의해야 할것은 서비스제공자에서 콜백될 함수포인터의 원형을 정의해 주기때문에
미리 정해진 원형으로 우리는 함수정의를 해줘야합니다

그리고 콜백함수는 CALLBACK으로 해줘야 하는것은 아닙니다
CALLBACK은 단지 함수호출규약인 __stdcall의 매크로 입니다

함수호출은 인수를 집어넣는방향과 인수를 스택에서 제거하는 방법에따라
__cdecl __pascal  __stdcall로 분리 되는데
C 에서는 기본으로 __cdelc 호출을 합니다

하지만 윈도우 프로시져에서는 여러가지 이유로(성능향상) __stdcall로 호출하는것이
유리하기에 __stdcall로 호출을 하고 단지 의미구분을 위해 CALLBACK으로
매크로 했을 뿐입니다...
콜백함수는 운영체제에서뿐만아니라 특정서버등 어떤 서비스를 제공할때
많이 사용 됩니다

대충 작동방식이 이해가 되실런지요?
그리고 부족한 2%를 매꿔주실분들 리플 부탁드립니다
부족한글 읽어주셔서 감사합니다