#include <windows.h>

LRESULT CALLBACK wndproc (HWND,UINT, WPARAM, LPARAM);
HINSTANCE ginst;
LPCTSTR lpct=TEXT("첫 번째 예재");

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
 HWND hwnd;
 MSG message;
 WNDCLASS wndclass;
 ginst=hInstance;

 wndclass.cbClsExtra=0;
 wndclass.cbWndExtra=0;
 wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);
 wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);
 wndclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);
 wndclass.hInstance=hInstance;
 wndclass.lpfnWndProc=wndproc;
 wndclass.lpszClassName=lpct;
 wndclass.lpszMenuName=NULL;
 wndclass.style=CS_HREDRAW | CS_VREDRAW;
 RegisterClass(&wndclass);

 hwnd=CreateWindow(lpct,lpct, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, (HMENU)NULL,hInstance,NULL);

 ShowWindow(hwnd,nShowCmd);

 while (GetMessage(&message,NULL,0,0))
 {
  TranslateMessage(&message);
  DispatchMessage(&message);
 }
 return (int)message.wParam;
}

LRESULT CALLBACK wndproc(HWND hWnd,UINT msg, WPARAM wParam, LPARAM lParam)
{
 switch (msg)
 {
 case WM_DESTROY : PostQuitMessage(0);
  return 0;
 }
 return (DefWindowProc(hWnd, msg, wParam, lParam));
}


윈도우 창하나 띄우는 API 소스다
교제에 첫번째 예재가 이러한데 책이 바이블식으로 되있는데도 이해가 힘들다.

LRESULT CALLBACK wndproc (HWND,UINT, WPARAM, LPARAM);

이부분에 대해..
보면 LRESULT와 CALLBACK이라는 데이터형이 있습니다. LRESULT는 윈도우 프로시저에서 반환되는 데이터형이고 CALLBACK은 FAR PASCAL을 재정의한 것으로 콜백루틴이나 프로시저에서 사용한다.

먼저 LRESULT에 대해 말해 보면 LRESULT는 비주얼 C++에서 다음과 같이 선언되 있습니다.

#define LRESULT LONG

 즉 LRESULT는 long 변수의 다른 이름일 뿐이다. long이라는 리턴값을 쓰지 않고 굳이 LRESULT라고 재선언한 것은 이 값이 리턴값임을 좀더 명확히 나타내기 위한 프로그래머의 의도라 생각하면 된다. 결국 LRESULT로 반환되는 값은 long값이라 생각하면 되는데 그렇다고 해서 꼭 숫자일 필요는 없다. long은 4 바이트 변수이므로 LRESULT에 포인터를 캐스팅해서 반환해도 무관하다. 포인터 역시 4바이트의 변수일 뿐이다. 대부분의 윈도우 프로그램에서는 LRESULT 값으로 객체의 포인터를 반환하는 것을 자주 볼 수 있을 것이다.

 CALLBACK은 FAR PASCAL의 다른 이름이다. FAR라는 것은 원거리 포인터임을 나타내는 것이고 PASCAL이라는 것은 함수 호출규약을 나타내는 것이다. 프로그래밍 내에서 함수호출이라는 것은 그 함수의 시작포인터로 점프하는 것을 의미하고, 또 윈도우에서는 가상 메모리 주소를 사용하므로 대부분의 함수 진입부가 원거리 포인터라는 뜻.

 하지만 윈도우 95이상에서는 원거리 포인터와 근거리 포인터의 구분이 없으므로 FAR라는 것은 무시해도 상관없다. PASCAL 호출규약이라는 것은 함수를 호출할 때 넘겨지는 인자가 스택에 어떠한 순서로 쌓일지에 대한 약이다. C에서는 인자를 왼쪽에서부터 오른쪽으로 차례로 인자 값을 스택에 넣어 넘겨주고 함수에 진입하면 이와는 반대순서로 스택에서 그 값을 받아와 사용한다. 하지만 C++에서는 이와 반대의 순서로 스택에 인자를 넣어 사용하게 된다. 또한 PASCAL 호출규약은 함수를 호출하면 이전에 사용되던 변수의 값 ax, bx, cx 등의 값을 먼저 스택에 넣어두었다가 함수가 리턴되기 전에 이 값을 복원시켜주지만 C에서는 함수를 호출하기 전 이러한 일들을 하고 함수가 끝나서 이전의 스텝으로 돌아오면 그제서야 변수값을 복원하는 일을 한다다.

 이러한 것이 바로 FAR PASCAL이 의미하는 것이고 이것을 CALLBACK이라고 선언해 사용하는 것은 이 함수가 콜백함수로 사용됨을 프로그래머가 명시하기 위한 것이다. 즉 자신이 짠 이 함수는 윈도우에서 CALLBACK되어 불리어지는 함수라는 것을 자신이나, 다른 사람이 봐서 금방 알 수 있도록 이렇게 이름 붙여놓은 것이다. 이 두 가지 모두 사용 용도를 명확히 하는 역할을 할 뿐 다른 것과의 차이점은 없는데, 이렇게 사용하는 이유는 윈도우 프로그램의 크기가 예전에 비해 무척 커져가고 작업도 여러 사람이 같이 하는 경우가 많아 서로의 의도를 다른 사람에게 명확하게 설명하고자 하는 제작자의 의도가 들어있다고 보면 된다.

'C 언어' 카테고리의 다른 글

16장 링크리스트  (0) 2019.06.02
17장 디스크 파일의 사용  (0) 2019.06.02
CreateWindow() - 10개의 인수  (0) 2019.05.25
1. 배열  (0) 2019.05.25
ASCII 코드표  (0) 2019.05.25

+ Recent posts