클래스 만들기

 

HINSTANCE

H : Handle -> 고유 식별 번호

INSTANCE : 메모리에 등록된 객체

 

위의 함수 내용을 보면 GetMessage()라는 함수가 있다.

GetMessage() : 메시지를 읽어오는 함수

-> 시스템이 유지하는 '메시지 큐'라는 곳에서 메시지를 읽어오는 함수이다.

-> queue는 컴퓨터의 기본 자료구조의 한가지로 선입선출형 구조를 가진다.

-> 메시지도 먼저 들어온 메시지부터 처리해야 하기 때문에,

-> 메시지 큐에서 메시지를 읽어오면 구조체에 전달한다.

 

Windows는 대화식 운영체제이다.

키보드 눌림 -> 하드웨어가 이벤트 발생 -> OS 감지 -> 메시지 발생 -> 응용 프로그램 읽음 -> 처리

 

메시지 처리 함수는 WndProc 함수에서 처리한다.

DestroyWindow 함수가 호출되면 PostQuitMessage 함수를 호출한다.

PostQuitMessage 함수가 호출되면 메시지 큐에 WM_QUIT이라는 메시지를 발생시킨다.

 


GetMessage는 메시지 큐에서 메시지를 읽어왔을 때 WM_QUIT을 읽어올 경우 false를 반환한다.
그 외에는 true를 반환한다.
단, 읽어올 메시지가 없을 경우에는 해당 프로그램은 블로킹 상태에 빠지게 된다.

블로킹이란?
프로그램은 CPU를 점유하고 있는 상태이다.
Windows의 장점 중 하나인 멀티태스킹은 여러개의 윈도우를 띄울 수 있다.
내가 점유하고 있는 CPU를 다른 프로그램에 양보하는 것이 블로킹이다.

게임은 메시지 입력이 없어도 연산을 수행해야 한다.

-> CPU를 사용해야 한다.
->즉, GetMessage함수는 게임 개발에 적합하지 않은 함수라고 볼 수 있다.

 

Windows APi 프로젝트에 메인 소스파일 부분을 살펴보면 CALLBACK이라는 함수가 있는 것을 볼 수 있다.

CALLBACK 함수란?

운영체제에 의해 호출되는 응용 프로그램 내의 함ㅅ루를 가리켜 CALLBACK 함수라 한다.

 

함수 호출 규약

함수의 실행이 종료되면 할당되어 있는 Stack 영역을 정리해야한다.

이 때 Stack 영역을 함수를 호출한 호출원에서 정리할 것인지 피호출자가 정리할 것인지에 따라 규약이 나눠진다.

 

__stdcall

Win32 API의 기본 호출 규약.
피호출자가 stack 영역을 정리한다.
-> API에서 제공하는 함수들은 고정인자 함수를 제공해준다.
-> 본인이 인자를 몇개 받을지 알 수 있는 상황이기 때문에 본인이 Stack 영역을 정리할 수 있다.

 

__cdecl
C/C++의 기본 호출 규약이다.
호출자가 Stack 영역을 정리한다.
-> printf, scanf : 가변인자 함수
-> 인자의 개수가 변한다.
-> 함수가 실행되면 몇 개의 인자를 받는지 알 수 없는 상황이다.
-> 본인이 몇개를 받는지 알 수 없기 때문에 Stack 영역을 정리할 수 없게 된다.


__fastcall
레지스터를 사용하기 때문에 함수 호출을 빠르게 처리할 수 있다.

+ Recent posts