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์—์„œ๋Š” ์ž์‹ ์ด ํ˜„์žฌ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค, ํŒŒ์ผ ๋“ฑ์„ ์‚ฌ์šฉํ•˜๊ธฐ ์›ํ•  ๋•Œ, ํ•ด๋‹น ๊ฐœ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•ธ๋“ค์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. 



๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments