์ด ๋ฌธ์„œ์˜ ์›๋ณธ์€ ์™ธ๋ถ€ ์œ„ํ‚ค์—์„œ ๊ฐ€์ ธ์™”์Šต๋‹ˆ๋‹ค.
Win32 API์—์„œ ๋„˜์–ด์˜ด
1. ๊ฐœ์š”2. ํŠน์ง•
2.1. ํ•˜๋“œ์›จ์–ด ๋…๋ฆฝ์ 2.2. ๋™์  ๋งํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ2.3. ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ2.4. ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ (Kernel Object)2.5. ๋ฆฌ์†Œ์Šค
3. Hello, Windows ํ”„๋กœ๊ทธ๋žจ
3.1. ๋ฉ”์‹œ์ง€ ๋ฐ•์Šค3.2. ์œˆ๋„์šฐ
4. ๊ด€๋ จ ๋ฌธ์„œ

1. ๊ฐœ์š”[ํŽธ์ง‘]

Windows API๋Š” Microsoft Windows์—์„œ ์‚ฌ์šฉํ•˜๋Š” C์–ธ์–ด ๊ธฐ๋ฐ˜์˜ API์ด๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” C์–ธ์–ด ๊ธฐ๋ฐ˜์ด์ง€๋งŒ, C++์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ์œˆ๋„์šฐ์—์„œ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ์ข…๋ฅ˜์˜ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋“ค์€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ „๋ถ€ ์ด ์œˆ๋„์šฐ API ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ˜•ํƒœ๋กœ ๋ฐ”๋€๋‹ค.[1]

2. ํŠน์ง•[ํŽธ์ง‘]

2.1. ํ•˜๋“œ์›จ์–ด ๋…๋ฆฝ์ [ํŽธ์ง‘]

๊ณผ๊ฑฐ์˜ MS-DOS ํ™˜๊ฒฝ์—์„œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์‹œ์Šคํ…œ์— ์—ฐ๊ฒฐ๋œ ์žฅ์น˜์˜ ์ข…๋ฅ˜๋ฅผ ๋ชจ๋‘ ์•Œ์•„์•ผ ํ–ˆ๋‹ค. ๊ฐ€๋ น ํ•œ์ปด์˜คํ”ผ์Šค ํ•œ๊ธ€ ๊ฐ™์€ ์›Œ๋“œํ”„๋กœ์„ธ์„œ๋ฅผ ๋งŒ๋“ ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์ž. ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์€ ๋ชจ๋‹ˆํ„ฐ์™€ ํ”„๋ฆฐํ„ฐ์ธ๋ฐ, ๊ณผ๊ฑฐ์—๋Š” ์ด ๊ทธ๋ž˜ํ”ฝ ์ถœ๋ ฅ ์žฅ์น˜ ๋ฐ ํ”„๋ฆฐํ„ฐ์— ๋Œ€ํ•œ ์ œ์–ด ์ฝ”๋“œ๋ฅผ ์ผ์ผ์ด ๋งŒ๋“ค์–ด ์ฃผ์–ด์•ผ ํ–ˆ๋‹ค.[2] ๋งŒ์•ฝ ํšŒ์‚ฌ๋‚˜ ํ•™๊ต์—์„œ ์‚ฌ์šฉ ์ค‘์ธ ์›Œ๋“œ ํ”„๋กœ์„ธ์„œ๊ฐ€ ํ•™๊ต์— ์žˆ๋Š” ํ”„๋ฆฐํ„ฐ์— ๋งž์ถ”์–ด ์„ค์ •๋˜์–ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ๋ณด์ž. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์™ธ๊ตญ์—์„œ ํ”„๋ฆฐํ„ฐ ์ข‹์€ ๊ฑฐ ์žˆ๋‹ค๊ณ  ํ•ด์„œ ์‚ฌ ์™”๋Š”๋ฐ, ์‚ฌ์šฉ์ค‘์ธ ์›Œ๋“œ ํ”„๋กœ์„ธ์„œ์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ”„๋ฆฐํ„ฐ๋ผ๋ฉด ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜, ํ˜น์€ ์›Œ๋“œํ”„๋กœ์„ธ์„œ์—์„œ ์‚ฌ์šฉ์ž ์ •์˜๋กœ ํ”„๋ฆฐํ„ฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด, ํ”„๋ฆฐํ„ฐ ๋งค๋‰ด์–ผ์„ ๊บผ๋‚ด๋“ค๊ณ , ํ•˜๋‚˜ ํ•˜๋‚˜ ์ œ์–ด์ฝ”๋“œ๋ฅผ ๋งž์ถ”์–ด ์›Œ๋“œํ”„๋กœ์„ธ์„œ์— ์ธ์‹์‹œํ‚ค๋ฉด ๋œ๋‹ค. ๊ท€์ฐฎ๊ณ  ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ๋ฟ์ด์ง€ ํ•˜๋ฉด ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ด์—ˆ์œผ๋ฏ€๋กœ ์•„๋ฌด๋„ ๋ถˆ๋งŒ์ด ์—†์—ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ Windows ํ™˜๊ฒฝ์—์„œ๋Š” ์ด๋Ÿฐ ํ•˜๋“œ์›จ์–ด ์ œ์–ด ์ฝ”๋“œ๋Š” ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„๊ฐ€ ๊ฐ€์ ธ๊ฐ€๊ฒŒ ๋˜๋ฉฐ, ๋ฌธ์ž ์ถœ๋ ฅ์€ DrawText ๋˜๋Š” TextOut ํ•จ์ˆ˜ ํ˜ธ์ถœ๋กœ ํ•œํ์— ๋๋‚ด๊ฒŒ ๋œ๋‹ค. ๊ผญ ๋ฌธ์ž ์ถœ๋ ฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฑฐ์˜ ๋ชจ๋“  ๊ฒŒ ์ด๋Ÿฐ ์‹์œผ๋กœ ํ•˜๋“œ์›จ์–ด์˜ ์ข…๋ฅ˜์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค. ๊ฑฐ๊พธ๋กœ ์œˆ๋„์šฐ ํ™˜๊ฒฝ์œผ๋กœ ๋„˜์–ด์˜ค๋ฉด์„œ ํ•˜๋“œ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ๋ฅผ ์ง์ ‘ ๊ฑด๋“œ๋ ค ์ œ์–ดํ•˜๋Š” ๋ฐฉ์‹์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•์€ ์™„์ „ํžˆ ์‚ฌ์žฅ๋˜์—ˆ๋‹ค.[3] ์œˆ๋„์šฐ์—์„œ๋Š” ํ•˜๋‚˜์˜ ์šด์˜์ฒด์ œ ์œ„์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น ๋ฐ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ ํ™˜๊ฒฝ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

2.2. ๋™์  ๋งํฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ[ํŽธ์ง‘]

์œˆ๋„์šฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ผญ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜•ํƒœ๊ฐ€ ์•„๋‹Œ DLL ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด ์œˆ๋„์šฐ ์šด์˜์ฒด์ œ ์•ˆ์— ๋‚ด์žฅ์‹œ์ผœ ๋†“์•˜๋Š”๋ฐ, ๋ณดํ†ต %SystemRoot%\System32 ๊ฒฝ๋กœ์— ๊ฐ€ ๋ณด๋ฉด ์ด๋Ÿฐ DLL๋“ค์„ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ ๋™์ ์œผ๋กœ ๋ถˆ๋ ค์˜ค๋Š” DLL์˜ ํŠน์ง•์ƒ, ํ”„๋กœ๊ทธ๋žจ์„ ํ•œ ๋ฒˆ ์งœ ๋†“์œผ๋ฉด ์œˆ๋„์šฐ ๋ฒ„์ „์ด ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ์œˆ๋„์šฐ DLL์ด ๊ฐœ์„ ๋˜๋Š” ๊ฒฝ์šฐ ๊ทธ์— ๋งž๊ฒŒ ํ”„๋กœ๊ทธ๋žจ ๊ธฐ๋Šฅ๋„ ๊ฐœ์„ ๋˜๊ฒŒ ๋œ๋‹ค. ํ•˜์ง€๋งŒ ํ˜ธํ™˜์„ฑ์ด ๋ฌธ์ œ

์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” DLL์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
  • kernel32.dll: ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ, ํŒŒ์ผ ์ž…/์ถœ๋ ฅ, ํ”„๋กœ๊ทธ๋žจ ๋กœ๋“œ/์‹คํ–‰ ๋“ฑ ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ๋‹ค. Windows NT ๋ถ€ํ„ฐ๋Š” Kernel32.dll์€ ํŠธ๋žจํด๋ฆฐ ์—ญํ• ๋งŒ์„ ํ•˜๋ฉฐ ์‹ค์ œ ๊ธฐ๋Šฅ์€ ntdll.dll์ด ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. (Kernel32.dll โ†’ KernelBase.dll โ†’ ntdll.dll)[4]
  • gdi32.dll : ํ™”๋ฉด/ํ”„๋ฆฐํ„ฐ์˜ ๊ทธ๋ž˜ํ”ฝ ์ถœ๋ ฅ์„ ๊ด€๋ฆฌํ•œ๋‹ค.
  • user32.dll : ์œˆ๋„์šฐ[5], ๋Œ€ํ™” ์ƒ์ž, ๋ฉ”๋‰ด ๋“ฑ์„ ๊ด€๋ฆฌํ•œ๋‹ค.

2.3. ๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ[ํŽธ์ง‘]

MS-DOS ํ™˜๊ฒฝ์ด๋‚˜ ์ฝ˜์†” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ํ๋ฆ„์ด ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ์— ๋”ฐ๋ผ์„œ ์›€์ง์˜€๋‹ค๋ฉด, ์œˆ๋„์šฐ์—์„œ๋Š” ํ”„๋กœ๊ทธ๋žจ ์™ธ๋ถ€์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์ด๋ฒคํŠธ๋“ค์„ ๋ฉ”์‹œ์ง€์˜ ํ˜•ํƒœ๋กœ ์ „๋‹ฌ๋ฐ›์„ ๊ฐ์ฒด์—๊ฒŒ ์•Œ๋ ค ์ค€๋‹ค. ํ•˜๋“œ์›จ์–ด ์ด๋ฒคํŠธ[6]๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด, ์œˆ๋„์šฐ์˜ ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ํ์— ์ด๊ฒƒ์ด ์Œ“์ด๊ฒŒ ๋˜๊ณ , ์‹œ์Šคํ…œ ๋ฉ”์‹œ์ง€ ํ์— ๋“ค์–ด์˜จ ๋ฉ”์‹œ์ง€๋ฅผ ์šด์˜์ฒด์ œ๊ฐ€ ํ•ด๋‹นํ•˜๋Š” ๊ฐ์ฒด์˜ ๋ฉ”์‹œ์ง€ ํ์— ๋„ฃ์–ด ์ค€๋‹ค. ํ”„๋กœ๊ทธ๋žจ์€ while๋ฌธ์„ ๋Œ๋ฉด์„œ ๊ณ„์† ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์–ด์„œ, switch-caseํ•ด์„œ ์–ด๋–ค ๋ฉ”์‹œ์ง€๊ฐ€ ์˜ค๋ฉด ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๋กœ์ง์„ ๊ธฐ์ˆ ํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„๋‹ค. ๋ฉ”์„ธ์ง€๋Š” 3๊ฐ€์ง€์˜ ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋ฉ”์„ธ์ง€๋ฅผ ๊ตฌ๋ณ„ํ•˜๊ธฐ ์œ„ํ•œ ์ˆซ์ž ๋ฐ์ดํ„ฐ, ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ 2๊ฐœ์˜ ์ˆซ์ž ๋ฐ์ดํ„ฐ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.[7]

์ถ”๊ฐ€์ ์œผ๋กœ ๋งํ•˜๋ฉด ํ”ํžˆ OS๋ฅผ ๋งํ•˜๋Š” ์œˆ๋„์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ UI๊ฐ์ฒด๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ƒ์—์„œ ์œˆ๋„์šฐ๋ผ๊ณ  ๋ถ€๋ฅด๊ฒŒ ๋˜๋Š”๋ฐ ์ด UI๊ฐœ์ฒด๋Š” ๋ชจ๋‘ ๋ฉ”์„ธ์ง€๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. UI๊ฐ์ฒด๋Š” ๋ฒ„ํŠผ, ์ด๋ฏธ์ง€, ์ฐฝ ๋“ฑ UI๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ชจ๋“  ๋ถ€๋ถ„์ด ๋‚˜๋‰˜์–ด์ ธ ์žˆ์œผ๋ฉฐ ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ํ”„๋กœ๊ทธ๋žจ ๋‚ด๋ถ€์˜ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฒŒ ๋œ๋‹ค๋ฉด OS๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ์–ด๋А๋ถ€๋ถ„์— ๋งˆ์šฐ์Šค๊ฐ€ ๋ˆŒ๋ฆผ ์ด๋ผ๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ด๊ฒŒ ๋˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์€ ํ•ด๋‹น ๋ฉ”์„ธ์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๊ณ  ์ขŒํ‘œ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ ํ•ด๋‹น ์œ„์น˜์˜ UI๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น UI๊ฐ์ฒด์—๊ฒŒ ๊ทธ ๋ฉ”์„ธ์ง€๋ฅผ ์ „๋‹ฌํ•œ๋‹ค. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•œ๋‹ค๊ณ  ํ–ˆ์œผ๋‹ˆ ํ•ด๋‹น ๋ฒ„ํŠผ์—๊ฒŒ ๋ฉ”์„ธ์ง€๊ฐ€ ์ „๋‹ฌ๋˜๊ฒŒ ๋˜๊ณ  ํ•ด๋‹น ๋ฒ„ํŠผ์—์„œ ํด๋ฆญ์‹œ ํ•ด์•ผ๋  ์ผ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

2.4. ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ (Kernel Object)[ํŽธ์ง‘]

ํ•ธ๋“ค(Handle) ๋˜๋Š” ์ปค๋„ ์˜ค๋ธŒ์ ํŠธ(Kernel Object) ๋Š” ์œˆ๋„์šฐ์—์„œ ์˜ค๋ธŒ์ ํŠธ์— ๋ถ™์—ฌ ์ฃผ๋Š” ์ˆซ์ž๋กœ, ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ฃผ์†Œ์ผ ์ˆ˜๋„ ์žˆ๊ณ , ์‹œ์Šคํ…œ์ด ์ „์—ญ์œผ๋กœ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ๋ถ™์ธ ๋ฒˆํ˜ธ์ผ ์ˆ˜๋„ ์žˆ๋‹ค. ์–ด๋–ค ์˜ค๋ธŒ์ ํŠธ๋Š” ์ฃผ์†Œ์˜ ์˜๋ฏธ๋ฅผ, ์–ด๋–ค ์˜ค๋ธŒ์ ํŠธ๋Š” ๋ฒˆํ˜ธ์˜ ์˜๋ฏธ๋ฅผ ๊ฐ–๋Š”๋‹ค.[8] ํ•ธ๋“ค์€ ๊ฐ๊ฐ์˜ ์œˆ๋„์šฐ, ๋ธŒ๋Ÿฌ์‹œ, ํŽœ, ํŒŒ์ผ, ํ”„๋กœ์„ธ์Šค, ์Šค๋ ˆ๋“œ ๋“ฑ ๊ฑฐ์˜ ๋ชจ๋“  ์˜ค๋ธŒ์ ํŠธ์— ๋ถ™๊ฒŒ ๋œ๋‹ค.

2.5. ๋ฆฌ์†Œ์Šค[ํŽธ์ง‘]

9x ๊ณ„์—ด์˜ ์œˆ๋„์šฐ์—์„œ ๋Š˜์ƒ ์–ธ๊ธ‰๋˜๋˜ ๋ฆฌ์†Œ์Šค์™€๋Š” ๊ด€๋ จ์ด ์—†์„....๋ ค๋‚˜~?
์œˆ๋„์šฐ ํ”„๋กœ๊ทธ๋žจ์„ ์งœ๋‹ค ๋ณด๋ฉด ๋ฉ”๋‰ด, ๋Œ€ํ™” ์ƒ์ž(๋‹ค์ด์–ผ๋กœ๊ทธ ๋ฐ•์Šค), ์•„์ด์ฝ˜, ๋น„ํŠธ๋งต ์ด๋ฏธ์ง€, ์ปค์„œ ๋“ฑ์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์–˜๋„ค๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰์„ ๋งŽ์ด ์žก์•„๋จน๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ์ด ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ์˜ฌ ๋•Œ ์–˜๋„ค๋“ค์ด ๋ฉ”๋ชจ๋ฆฌ์— ์ „๋ถ€ ๋‹ค ์˜ฌ๋ผ์™€๋ฒ„๋ฆฌ๋ฉด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ„ฐ์ ธ๋‚˜๊ฐ€๊ฒŒ(...) ๋œ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๊ฒƒ๋“ค์€ ๋ฆฌ์†Œ์Šค๋กœ ์ทจ๊ธ‰ํ•˜๋ฉฐ, ๋ฆฌ์†Œ์Šค ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ํ†ตํ•ด ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ์™€๋Š” ๋ณ„๊ฐœ๋กœ ์ปดํŒŒ์ผ๋˜๊ณ , ์ด๋“ค์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” LoadMenu, LoadIcon, LoadBitmap, LoadCursor ๋“ฑ์˜ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋“œํ•˜๋Š” ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค. ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฆฌ์†Œ์Šค๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ž๋™์œผ๋กœ ๋‚ด๋ ค๊ฐ„๋‹ค.

3. Hello, Windows ํ”„๋กœ๊ทธ๋žจ[ํŽธ์ง‘]

3.1. ๋ฉ”์‹œ์ง€ ๋ฐ•์Šค[ํŽธ์ง‘]

์ด ํ”„๋กœ๊ทธ๋žจ์€ ์•„๋ฌด ์•„์ด์ฝ˜๋„ ์—†๊ณ , ํ™•์ธ ๋ฒ„ํŠผ์ด ํ•˜๋‚˜ ์กด์žฌํ•˜๋Š” ๋ฉ”์‹œ์ง€ ๋ฐ•์Šค์— "Hello, Windows!"๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.
#include <tchar.h>
#include <windows.h>

int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, TEXT("Hello, Windows!"), TEXT("Hello"), MB_OK);
    return 0;
}

3.2. ์œˆ๋„์šฐ[ํŽธ์ง‘]

์ด ํ”„๋กœ๊ทธ๋žจ์€ ํฐ์ƒ‰ ๋ฐ”ํƒ•์˜ ํด๋ผ์ด์–ธํŠธ ์˜์—ญ์˜ ์ •์ค‘์•™์— GDI๋ฅผ ์‚ฌ์šฉํ•ด "Hello, Windows!"๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์œˆ๋„์šฐ๋ฅผ ํ•˜๋‚˜ ๋„์šด๋‹ค.
#include <tchar.h>
#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    static TCHAR szAppName[] = TEXT("HELLOWINDOWS");
    HWND hWnd;
    MSG msg;
    WNDCLASS wndclass;

    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    wndclass.cbClsExtra = 0;
    wndclass.cbWndExtra = 0;
    wndclass.hInstance = hInstance;
    wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
    wndclass.lpszMenuName = NULL;
    wndclass.lpszClassName = szAppName;

    if (!RegisterClass(&wndclass))
    {   
        MessageBox(NULL, TEXT("This program requires Windows 2000 or upper."),
            szAppName, MB_OK | MB_ICONERROR);
	return 0;
    }

    hWnd = CreateWindow(szAppName, TEXT("Hello Windows Application"),
        WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT,
        CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }

    return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    HDC hDC;
    PAINTSTRUCT ps;
    RECT rect;

    switch (message)
    {
    case WM_CREATE:
        return 0;
    case WM_PAINT:
        hDC = BeginPaint(hWnd, &ps);
        GetClientRect(hWnd, &rect);
        DrawText(hDC, TEXT("Hello, Windows!"), -1, &rect,
            DT_SINGLELINE | DT_CENTER | DT_VCENTER);
        EndPaint(hWnd, &ps);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }

    return DefWindowProc(hWnd, message, wParam, lParam);
}

4. ๊ด€๋ จ ๋ฌธ์„œ[ํŽธ์ง‘]

[1] MFC, ๋น„์ฃผ์–ผ ๋ฒ ์ด์‹, ๋ธํŒŒ์ด ๋“ฑ ์œˆ๋„์šฐ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์‹คํ–‰ ์‹œ ์ „๋ถ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ๋“  ๋ณ€ํ™˜์„ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค.
[2] ํ—ˆํ˜๋ฆฌ์Šค, CGA, EGA, VGA๊ฐ™์€ ๊ทธ๋ž˜ํ”ฝ ๋“œ๋ผ์ด๋ฒ„์™€ ๊ฐ๊ฐ์˜ ํ”„๋ฆฐํ„ฐ์— ๋Œ€ํ•œ ์ œ์–ด ์ฝ”๋“œ๋ฅผ ์ผ์ผ์ด ๋‹ค ๋งŒ๋“ค์–ด์„œ ์›Œ๋“œํ”„๋กœ์„ธ์„œ ํ”„๋กœ๊ทธ๋žจ ์•ˆ์— ๋‚ด์žฅ์‹œ์ผœ ์ฃผ์–ด์•ผ ํ–ˆ๋‹ค.
[3] ๋‹ค๋งŒ ์‚ฐ์—…์šฉ์œผ๋กœ ISA ๋ฒ„์Šค ๋“ฑ ํ•˜๋“œ์›จ์–ด๋ฅผ ์ง์ ‘ ๊ฑด๋“œ๋ ค์•ผ ํ•˜๋Š” ๊ณณ์—์„œ๋Š” ์—ฌ์ „ํžˆ ์‚ฌ์šฉํ•œ๋‹ค. ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹Œ ๋“œ๋ผ์ด๋ฒ„ ๊ฐœ๋ฐœ์„ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋„ ๋งˆ์ฐฌ๊ฐ€์ง€.
[4] ๋Œ€๋ถ€๋ถ„์˜ ํ•จ์ˆ˜๋Š” ntoskrnl.exe์—์„œ ๊ตฌํ˜„๋˜๋ฉฐ, ์ด๋“ค์€ ntdll.dll๋ฅผ ํ†ตํ•ด์„œ ์‚ฌ์šฉ์ž ๋ชจ๋“œ์— ๋…ธ์ถœ๋œ๋‹ค. ntdll.dll๋Š” ์‹œ์Šคํ…œ ์ฝœ ์—ญํ• ์„ ํ•˜๋ฉฐ, ๋„ค์ดํ‹ฐ๋ธŒ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ ๊ฒฝ์šฐ ์ปค๋„๋ชจ๋“œ์— ๋“ค์–ด๊ฐ€์„œ SSDT๋ฅผ ํ†ตํ•ด ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง„ ntoskrnl.exe์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.
[5] "์ฐฝ"์˜ ์˜๋ฏธ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ทธ ์œˆ๋„์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
[6] ์‚ฌ์šฉ์ž๊ฐ€ ํ‚ค๋ณด๋“œ๋ฅผ ๋ˆ„๋ฅด๊ฑฐ๋‚˜ ๋งˆ์šฐ์Šค๋ฅผ ์›€์ง์˜€๋‹ค๊ฑฐ๋‚˜, ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€์˜ ์ž์ž˜ํ•œ ์ด๋ฒคํŠธ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
[7] ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ๋งˆ์šฐ์Šค๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋ฉ”์„ธ์ง€๋กœ, ๋งˆ์šฐ์Šค ํด๋ฆญ ์ด๋ฒคํŠธ ๋ฉ”์„ธ์ง€, x์ขŒํ‘œ, y์ขŒํ‘œ๋ผ๊ณ  ๋ฉ”์„ธ์ง€๊ฐ€ ๋‚ ๋ผ์˜จ๋‹ค.
[8] ํŠน์ • ์ข…๋ฅ˜์˜ ์˜ค๋ธŒ์ ํŠธ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ•ธ๋“ค์ด ์ฃผ์†Œ์ธ์ง€ ๋ฒˆํ˜ธ์ธ์ง€๋Š” ๋งˆ์ดํฌ๋กœ์†Œํ”„ํŠธ์—์„œ ๊ณต์‹์ ์œผ๋กœ ๋ฌธ์„œํ™”ํ•˜์ง€ ์•Š์•˜๋‹ค. ์ฆ‰ ์–ธ์ œ๋“  ๋ฐ”๋€” ์ˆ˜ ์žˆ๋‹ค.