Win32 API의 자료형

반응형

이제부터 우리는 Windows API를 Win32 API라고 정의하겠습니다.


그 이유는 우리가 만드는 프로그램은 x86인 32비트 기반의 컴파일러를 이용해서 프로그램을 빌드하고 있기 때문입니다. Win32와 Win64에 대한 설명은 차후에 별도의 포스팅을 통해 보도록 하겠습니다.


#include <windows.h>

우리는 Windows API를 사용할 때 위 헤더 파일을 사용하는 것으로 알고 있죠, 이 헤더 파일을 이용해서 간단한 메시지 창을 만들어보기도 했었습니다. 하지만 MessageBox의 인자 값에서는 여러가지 자료형들이 나왔는데요. 


MessageBoxA(_In_opt_ HWND hWnd, _In_opt_ LPCSTR lpText, _In_opt_ LPCSTR lpCaption, _In_ UINT uType);


자 위에 있는 MessageBoxA라하는 메소드를 보시게 되면, 인자값으로 HWND라고 하는 자료형과 LPCSTR, UINT라고 하는 자료형이 보이실 것입니다. 아마 표준 C 언어에서는 보지 못한 자료형일 것입니다. (실제로 Linux에서 또한 없는 자료형들입니다.)


우리는 이 자료형들이 어떤 것인지 알아보기 위해, minwindef.h 파일을 보기로 했습니다.


typedef unsigned long       DWORD;
typedef int                 BOOL;
typedef unsigned char       BYTE;
typedef unsigned short      WORD;
typedef float               FLOAT;
typedef FLOAT               *PFLOAT;
typedef BOOL near           *PBOOL;
typedef BOOL far            *LPBOOL;
typedef BYTE near           *PBYTE;
typedef BYTE far            *LPBYTE;
typedef int near            *PINT;
typedef int far             *LPINT;
typedef WORD near           *PWORD;
typedef WORD far            *LPWORD;
typedef long far            *LPLONG;
typedef DWORD near          *PDWORD;
typedef DWORD far           *LPDWORD;
typedef void far            *LPVOID;
typedef CONST void far      *LPCVOID;

typedef int                 INT;
typedef unsigned int        UINT;
typedef unsigned int        *PUINT;

minwindef.h 의 156줄 (Visual Studio 2015 Update 2 기준)을 시작하여 DWORD부터 LPCVOID에 대한 자료형이 어떤 것인지 정의되어 있습니다. DWORD는 아마 Windows의 레지스트리에서도 많이 보셨을 것입니다. 32비트의 길이를 지니는 정수값으로 unsigned long이 이에 해당합니다. 그 외에 UINT라는 것도 unsigned int로 정의가 되어 있습니다. 


//
// ANSI (Multi-byte Character) types
//
typedef CHAR *PCHAR, *LPCH, *PCH;
typedef CONST CHAR *LPCCH, *PCCH;

typedef _Null_terminated_ CHAR *NPSTR, *LPSTR, *PSTR;
typedef _Null_terminated_ PSTR *PZPSTR;
typedef _Null_terminated_ CONST PSTR *PCZPSTR;
typedef _Null_terminated_ CONST CHAR *LPCSTR, *PCSTR;
typedef _Null_terminated_ PCSTR *PZPCSTR;
typedef _Null_terminated_ CONST PCSTR *PCZPCSTR;

typedef _NullNull_terminated_ CHAR *PZZSTR;
typedef _NullNull_terminated_ CONST CHAR *PCZZSTR;

typedef  CHAR *PNZCH;
typedef  CONST CHAR *PCNZCH;

LPCSTR은 문자열 타입인데, 이 자료형은 winnt.h 파일에 정의되어 있습니다. 차후에 문자열 자료형에 대한 포스트를 별도로 작성할 것인데요. Linux에서는 UTF-8이라는 유니코드형태의 Character-code만을 사용하지만, Windows에서는 과거 Windows 버전의 호환성을 위해 ANSI (Multi-Byte characters) 타입을 별도로 정의하고 있습니다. (아마 이 파트를 배우시면, Windows에서 한국어 언어 팩이 없을 때, 왜 한글이 깨지는지 이해하실 수도 있을 겁니다. )


제 포스팅에서는 일반 자료형은 여기까지 설명하도록 하겠습니다. 자료형들을 주욱 살펴보시면, C 언어에서 기존에 있는 자료형들을 재정의한 것도 있는 등 쉬운 형태이기 때문에, 마지막으로 HWND만 설명하고 넘어가도록 하겠습니다.


typedef void *HANDLE;
#if 0 && (_MSC_VER > 1000)
#define DECLARE_HANDLE(name) struct name##__; typedef struct name##__ *name
#else
#define DECLARE_HANDLE(name) struct name##__{int unused;}; typedef struct name##__ *name
#endif
#else
typedef PVOID HANDLE;
#define DECLARE_HANDLE(name) typedef HANDLE name
#endif

HANDLE은 void의 포인터 형으로 정의되어 있습니다. Win32 API에서는 자신이 현재 사용하고 있는 프로세스, 파일 등을 사용하기 원할 때, 해당 개체를 사용할 수 있는 핸들을 사용할 수 있게 하고 있습니다. 



반응형

Tistory Comments 0