윈도우즈 API 정복 1장 - 먼저 알아야 할 것들
졸업과제를 진행하기 전 게임 클라이언트를 만들기 위해 윈도우즈 API 공부를 하려한다.
원래는 유니티로 하려했었는데 좀 더 저수준의 프로그래밍을 공부하고 싶어서 결정한 것이 바로 윈도우즈 API이다.
대학교 도서관에서 윈도우즈 API 정복이란 책을 대출하여 읽기 시작하였다.
책의 목차를 살펴보니 1권 2권 합쳐서 2200페이지 정도 되는 내용을 모두 찾아보기는 힘들 것 같고 기본적인 UI 사용 방법을 학습한 후 게임 클라이언트를 제작할 예정이다.
개인적으로 가장 중요하다고 생각하는 2권의 내용인 메모리 ~ 이후의 내용은 틈틈히 공부해나갈 예정이다.
윈도우즈 API를 공부하기 전 먼저 알아야 할 것들이라는 부분을 정리하고 시작하도록 하겠다.
#참고도서 윈도우즈 API 정복(개정판), 제 1권 (김상형), 한빛미디어(주)
1. 먼저 알아야 할 것들
이전에 윈도우즈 소켓 프로그래밍을 할 때 이미 윈도우즈 API의 함수들을 사용한 적이 있다.
그런데 그 때 각종 윈도우즈 API의 구조체나 자료형을 사용할 때 함수의 이름 앞에 붙는 접두어 같은 것들의 의미는 사실 잘 모르고 사용하였다. 책의 시작 부분에 해당 내용이 정리되어 있어서 너무 반가웠다.
가장 먼저 변수 명명법에 대해 알아보자.
1. 변수 명명법
접두어 | 원래말 | 의미 |
cb | Count of Bytes | 바이트 수 |
dw | double word | 부호없는 long형 정수 |
h | handle | 핸들 |
sz | Null Terminated | NULL 종료 문자열 |
ch | Character | 문자형 |
a | Array | 배열 |
w | Word | 부호없는 정수형 |
i | Integer | 정수형 |
p, lp | long pointer | 포인터형 |
b | Bool | 논리형 |
위에서 가장 많이 봐왔던 것은 p, lp 혹은 dw, h, cb 사실 안 보였던 것은 없는 것 같다.
p나 h와 같이 딱 봐도 알 것 같은 접두어는 느낌으로 알고 있었지만 dw, cb와 같은 것은 의미를 전혀 모르고 사용해왔었다.
이런 것을 기본기로 삼아 더 정교한 프로그래밍을 할 수 있는 발판이 될 것 같다.
2. 데이터형
데이터형 | 의미 |
BYTE | unsigned char |
CHAR | char |
WORD | unsigned short |
DWORD | usigned long |
LONG | long |
BOOL | 정수형, TRUE, FALSE 중 하나 |
데이터형이다. WORD와 DWORD, BYTE 형은 엄청 자주 사용되었던 것 같다.
이어서 윈도우 핸들에 대한 이해가 필요하다.
핸들은 윈도우 운영체제가 발급하고 운영체제에서 사용하는 것이라고 대충은 알고 있었지만 더 자세히 알아보겠다.
3. 핸들
핸들(handle)이란 구체적인 어떤 대상에 붙여진 번호이다. (32비트 혹은 64비트)
- 핸들은 일단 정수값이며 대부분 32비트이다.
- 같은 종류의 핸들끼리는 절대 중복된 값을 가지지 않는다.
- 정수형은 비교나 대입 연산이 가장 빠르므로 핸들로 쓰기 적합하다.
- 운영체제가 발급하며 프로그래머는 쓰기만 한다.
- 핸들의 실제값이 무엇인지 몰라도 상관없다. (핸들을 만들어 사용 -> 다 쓰면 버리면 됨)
핸들은 위와 같은 특징을 갖는다.
간단히 요약하자면 윈도우 운영체제에서 발급한 식별자 같은 도구이다.
4. 비트 OR 연산자
윈도우 API 함수 중에는 엄청나게 많은 수의 인자를 받는 경우가 있다고 한다.
사용하지 않는 인수에도 값을 주어야 하므로 엄청나게 번거롭기 때문에 인자를 전달할 때 비트 연산자 | 를 사용한다.
전처리기로 윈도우의 인수들이 비트 단위로 저장되어 있고 이것을 사용할 때는 다음과 같이 사용한다.
DT_CENTER | DT_BOTTOM | DT_WORDBREAK
이렇게 설정하면 3가지 옵션이 켜진 상태로 전달되게 된다.
BIT FLAG를 사용하는 것과 같은 것 같다.
5. 유니코드
C언어는 기본적으로 ANSI 타입을 사용한다고 알고 있다. 그런데 다양한 국가의 언어를 단일화된 코드 체계로 표현하기 위해 유니코드 옵션을 사용하면 좋다. 유니코드로 컴파일하면 이후 국제화에 유리하다는 장점이 있다.
유니코드 옵션을 주면 프로그램 전체가 유니코드로 빌드되는 방식이다.
C 타입 | 유니코드 타입 |
char | TCHAR |
char* | LPSTR |
const char* | LPCSTR |
예를들어 TCHAR은 일반적인 상황에서는 C 타입인 char로 컴파일 되지만 유니코드 옵션을 주면 wchar_t 타입으로 컴파일 되는 형식이다.
#ifdef UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif
위와 같은 형식으로 구현되어 있다.
추가로 문자열을 다룰 때도 C 표준 함수 대신 유니코드도 함께 지원하는 함수를 사용하는 것이 좋다.
함수 이름의 앞에 l만 하나 더 붙여주면 된다.
ex) strlen -> lstrlen
추가로 문자열을 선언할 때 TEXT 매크로로 둘러싸는 것이 좋다.
TEXT 매크로는 유니코드 설정에 따라 문자열 상수의 타입을 변경하는 매크로이다.
TCHAR *str = TEXT("Hello");
여기까지 윈도우즈 API를 공부하기 전 먼저 알아야 하는 내용들을 살펴보았다.
생각보다 사전 지식임에도 도움이 될법한 내용이 많았고 알찼다.
변수 명명법은 특히나 좋은 정보였다. 기본기를 탄탄히 다져서 좋은 프로그래머가 되고 싶다.