클래스 만들기
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
레지스터를 사용하기 때문에 함수 호출을 빠르게 처리할 수 있다.
'Programming > Windows APi' 카테고리의 다른 글
Windows API_WinMain (0) | 2020.10.25 |
---|---|
Windows API_유니코드 (0) | 2020.10.25 |
Windows API_핸들(handle)에 대한 이해 (0) | 2020.10.25 |
Windows API_윈도우즈 프로그래밍에서 주로 사용되는 접두어 (0) | 2020.10.25 |
Windows API_화면에 선 그리기 (0) | 2020.10.09 |