๋ฐ˜์‘ํ˜•

๋ณธ๋ฌธ์˜ ๋‚ด์šฉ์€ Mike Dickheiser ์ €์ž์˜ C++ For Game Programmers (Game Development Series) 2nd Edition์˜ ๋‚ด์šฉ์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์†Œ๊ฐœ

ํ”Œ๋Ÿฌ๊ทธ์ธ(plugin)์— ๋Œ€ํ•ด์„œ ๋“ค์–ด๋ณด์…จ๋‚˜์š”? Wikipedia์—์„œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ •์˜ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋งํฌ: ko.wikipedia.org/wiki/%ED%94%8C%EB%9F%AC%EA%B7%B8%EC%9D%B8

ํ”Œ๋Ÿฌ๊ทธ์ธ(plugin) ๋˜๋Š” ์ถ”๊ฐ€ ๊ธฐ๋Šฅ(์• ๋“œ์ธ;add-in, ์• ๋“œ์˜จ;add-on)์€ ํ˜ธ์ŠคํŠธ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์„œ๋กœ ์‘๋‹ตํ•˜๋Š” ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ์ด๋ฉฐ, ํŠน์ •ํ•œ "์ฃผ๋ฌธ์‹" ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ๊ณตํ•˜๋Š” ๊นŒ๋‹ญ์€ ๋งŽ๋‹ค. ์ด๋ฅผํ…Œ๋ฉด, ์„œ๋“œํŒŒํ‹ฐ ๊ฐœ๋ฐœ์ž๋“ค์ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ํ™•์žฅํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ฒŒ ํ•˜๊ฑฐ๋‚˜, ๋œป๋ฐ–์˜ ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๊ฑฐ๋‚˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ฑฐ๋‚˜, ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๋ผ์ด์„ ์Šค ๋ฌธ์ œ๋กœ ์ธํ•ด ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์ „๋ฌธ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ๋‹ค๋ฃจ๋Š” ๋ถ„์ด๋ผ๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŽ์ด ๋‹ค๋ค„ ๋ดค์œผ๋ฆฌ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ Visual Studio์˜ ํ™•์žฅ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•ด๋ดค๋‹ค๋ฉด ๋‹จ ๋ฒˆ์— ์ดํ•ด๊ฐ€ ๋˜์‹ค ๊ฒ๋‹ˆ๋‹ค. ๋˜๋Š” ์ตœ๊ทผ์— ์†Œ๊ฐœํ•œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์ธ ImageJ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ๋„ ๊ฐ™์€ ๋งฅ๋ฝ์ž…๋‹ˆ๋‹ค.

[์œ ํ‹ธ๋ฆฌํ‹ฐ] ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ์— ํ•„์ˆ˜์ธ ImageJ ์‚ดํŽด๋ณด๊ธฐ!

 

[์œ ํ‹ธ๋ฆฌํ‹ฐ] ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ์— ํ•„์ˆ˜์ธ ImageJ ์‚ดํŽด๋ณด๊ธฐ!

์†Œ๊ฐœ ImageJ๋Š” ๋ฏธ๊ตญ ๊ตญ๋ฆฝ๋ณด๊ฑด์›(NIH)์—์„œ ์—ฐ๊ตฌ์šฉ์œผ๋กœ ๋งŒ๋“  Java ๊ธฐ๋ฐ˜์˜ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์ž…๋‹ˆ๋‹ค. Java ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•ด ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ๋ฐฉํ˜• ์•„ํ‚คํ…์ฒ˜๋กœ ์„ค๊ณ„๋˜์–ด์žˆ์–ด, ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค

luckygg.tistory.com

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ฐœ๋…๊ณผ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋„๋ก ํ”„๋กœ๊ทธ๋žจ์„ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ํ•„์š”์„ฑ

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

์ด๋Ÿฌํ•œ ๋ฌธ์ œ์—์„œ ํ›จ์”ฌ ๋” ์œ ์—ฐํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์—๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ๋งŒ ์ œ๊ณตํ•˜๊ณ , ๋‚˜๋จธ์ง€ ๊ธฐ๋Šฅ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด๋ผ๋Š” ํ™•์žฅ์„ ํ†ตํ•ด ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‚ฌ์šฉ์ž๋Š” ์›ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ๋งŒ ๋กœ๋“œํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, ํ”„๋กœ๊ทธ๋žจ ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ํ™•์žฅํ•˜๊ณ , ๋ช‡ ๊ฐ€์ง€ API๋ฅผ ์ œ๊ณตํ•จ์œผ๋กœ์จ ์‚ฌ์šฉ์ž ๋˜๋Š” ๋‹ค๋ฅธ ํšŒ์‚ฌ๊ฐ€ ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํƒ‘์žฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž์ฒด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ

๋””์ž์ธ ํŒ€์—์„œ ๋””์ž์ด๋„ˆ๋“ค์ด ์„ ํ˜ธํ•˜๋Š” ๋ชจ๋ธ๋ง ํ”„๋กœ๊ทธ๋žจ ์ตœ์‹  ๋ฒ„์ „์„ ์ƒˆ๋กœ ๊ตฌ๋งคํ–ˆ๋‹ค๋Š” ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ฒ€ํ† ํ•˜๊ณ  ๊ตฌ๋งคํ–ˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ, ํ”„๋กœ๊ทธ๋žจ ์„ค์น˜ ํ›„ ์ด๋Ÿฐ ๊ธฐ๋Šฅ ์ €๋Ÿฐ ๊ธฐ๋Šฅ์„ ์‚ดํŽด๋ด…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ •๋ง๋กœ ํ•„์š”๋กœ ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์—†๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ฌ์•˜์„ ๋•Œ์—๋Š” ์ด๋ฏธ ๋Šฆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์–ด๋–ค ๋Œ€์•ˆ์ด ์žˆ์„๊นŒ์š”?

์ฒซ ๋ฒˆ์งธ๋Š” ์›ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๋ชจ๋‘ ๊ฐ–์ถ˜ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฐ ํ”„๋กœ๊ทธ๋žจ์„ ์ฐพ๊ธฐ๋ž€ ํž˜๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ™์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ๋น„์šฉ๋„ ๋ฌธ์ œ์ด๊ณ  ํ”„๋กœ๊ทธ๋žจ ๊ฐ„์— ์ƒํ˜ธ ํ˜ธํ™˜์„ฑ์ด ๋ฌธ์ œ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์„ธ ๋ฒˆ์งธ๋Š” ๋””์ž์ด๋„ˆ๋ฅผ ์œ„ํ•œ ์ž์ฒด ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ƒ์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ˆ˜ ๋ฐฑ๋ช…์˜ ํŒ€์ด ๋งŒ๋“  ํ”„๋กœ๊ทธ๋žจ์„ ๋Œ€์ฒดํ•  ์ˆœ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰ ๋ฐฉ๋ฒ•์€ ๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก , ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋กœ ์„ค๊ณ„๋˜์–ด ์žˆ์–ด์•ผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ํ”„๋กœ๊ทธ๋žจ์€ ๋Œ€๋ถ€๋ถ„ ๊ทธ๋ ‡๊ฒŒ ์„ค๊ณ„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ ์€ ๋น„์šฉ์œผ๋กœ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ํ”„๋กœ๊ทธ๋žจ์„ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ

์šฐ๋ฆฌ๊ฐ€ ๊ฐœ๋ฐœํ•  ํ”„๋กœ๊ทธ๋žจ์— ๊ตณ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ผ๊นŒ์š”? ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ธ์ œ๋“ ์ง€ ํ”„๋กœ๊ทธ๋žจ์„ ์ˆ˜์ •ํ•˜๊ณ , ๋‹ค์‹œ ์ปดํŒŒ์ผํ•œ ํ›„ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์œผ๋กœ ๋ฆด๋ฆฌ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ๋‹ต๋ณ€ํ•˜์ž๋ฉด, ํ”„๋กœ๊ทธ๋žจ์„ ํ™•์žฅํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•œ ๋ฒˆ ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๊ตฌ์ถ•๋˜๋ฉด, ํ”„๋กœ๊ทธ๋žจ ์ž์ฒด์— ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์ƒˆ๋กœ์šด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ์˜ ๋˜ ๋‹ค๋ฅธ ์žฅ์ ์€, ํ”„๋กœ๊ทธ๋žจ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๋‚ด์šฉ์œผ๋กœ๋ถ€ํ„ฐ ์™„์ „ํžˆ ์ ˆ์—ฐ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์˜ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์›ํ•˜๋ฉด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰ ์žฅ์ ์€ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ์‚ฌ์šฉ์ž๋“ค์— ์˜ํ•ด ์ž๋ฐœ์ ์œผ๋กœ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ™•์‚ฐ๋˜์–ด ํ”„๋กœ๊ทธ๋žจ์˜ ์ธ์ง€๋„๊ฐ€ ์ฆ๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜

๋ณธ๋ฌธ์—์„œ ๋‹ค๋ฃฐ ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ์‚ฌ์น™ ์—ฐ์‚ฐ์„ ํ•˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•˜์—ฌ, ๋‘ ๊ฐœ์˜ ์ˆซ์ž๋ฅผ ์—ฐ์‚ฐํ•˜๋Š” ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ์ œ ์ฝ”๋“œ๋Š” ๋ณธ๋ฌธ ํ•˜๋‹จ์— ์ฒจ๋ถ€๋˜์–ด ์žˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

IPlugin Interface

์ „๋ฐ˜์ ์ธ ํ”Œ๋Ÿฌ๊ทธ์ธ ์•„ํ‚คํ…์ฒ˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์œ„ํ•œ ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค์—๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์กฐ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“  ๊ธฐ๋Šฅ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์ตœ์†Œ ํ•จ์ˆ˜ ์ง‘ํ•ฉ๋งŒ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

class IPlugin 
{
public:
	virtual ~IPlugin() {};
	
	virtual bool Initialize() = 0;
	virtual bool Shutdown() = 0;
	virtual void About(HWND hParent) = 0;
	virtual double Execute(double a, double b) = 0;
	virtual const std::string GetName() = 0;
};

ํ”„๋กœ๊ทธ๋žจ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ About() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. About() ํ•จ์ˆ˜๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ์ด๋ฆ„, ๋นŒ๋“œ ๋‚ ์งœ ๋ฐ ๋ฒ„์ „ ์ •๋ณด ๋“ฑ์ด ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ๋กœ๋“œ๋œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์˜ฌ๋ฐ”๋ฅธ ๋ฒ„์ „์ธ์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ ๋ณต์‚ฌ ๋ฐ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด, ์‚ฌ์šฉ์ž์˜ ๊ณจ์นซ๊ฑฐ๋ฆฌ๋ฅผ ๋งŽ์ด ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์˜ˆ์—์„œ๋Š” ๋ชจ๋“  ์ดˆ๊ธฐํ™”๋Š” ์ƒ์„ฑ์ž์—์„œ, ๋ชจ๋“  ์ข…๋ฃŒ๋Š” ์†Œ๋ฉธ์ž์—์„œ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•˜๋ฏ€๋กœ ๋ณ„๋„์˜ ์ƒ์„ฑ์ž ๋ฐ ์†Œ๋ฉธ์ž ํ•จ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์ƒ์„ฑ๋์ง€๋งŒ ์ดˆ๊ธฐํ™”๋˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ดˆ๊ธฐํ™” ๋ฐ ์ข…๋ฃŒ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š”๋ฐ ์„ ํ˜ธ๋˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์ดˆ๊ธฐํ™”๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ(์˜ˆ, ํŒŒ์ผ ์ ‘๊ทผ ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น), ์ƒ์„ฑ์ž์˜ ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์น™์—ฐ์‚ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ตฌํ˜„

IPlugin์„ ์ƒ์†๋ฐ›๋Š” ๋ง์…ˆ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

class PluginAdd : public IPlugin
{
public:
	PluginAdd(PluginManager &mgr);
    
	virtual bool Initialize();
	virtual bool Shutdown();
	virtual void About(HWND hParent);
	virtual double Execute(double a, double b);
	virtual const std::string GetName();

private:
	PluginManager &m_hManager;
	std::string m_strName;
};

๋บ„์…ˆ ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ ๊ตฌํ˜„๋„ ๋ณผ๊นŒ์š”?

class PluginSub : public IPlugin
{
public:
	PluginSub(PluginManager &mgr);

	virtual bool Initialize();
	virtual bool Shutdown();
	virtual void About(HWND hParent);
	virtual double Execute(double a, double b);
	virtual const std::string GetName();

private:
	PluginManager &m_hManager;
	std::string m_strName;
};

IPlugin์œผ๋กœ๋ถ€ํ„ฐ ์ƒ์†๋ฐ›๋Š” ์ƒˆ๋กœ์šด ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ  ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๋Š” ์ž‘์—…์€ ๊ฑฐ์˜ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋‹ค๋ฃจ๊ธฐ

๋ณธ๋ฌธ์˜ ์˜ˆ์ œ์™€ ๋ณ„๊ฐœ๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ž‘์„ฑํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์œ ํ˜•์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ ์ƒ์†(Inheritance)์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

class IPlugin
{
	public:
		virtual ~IPlugin () {};
		virtual const std::string & GatName() = 0;
		virtual const VersionInfo & GetVersion() = 0;
		virtual void About() = 0;
};

๊ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์œ ํ˜•์— ๋Œ€ํ•ด IPlugin์—์„œ ํŒŒ์ƒ๋œ ํด๋ž˜์Šค๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜์—ฌ, ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ ์œ ํ˜•์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

class IPluginExporter : public IPlugin
{
	public:
		virtual ~IPluginExporter () {};
		virtual bool Export (Data * pRoot) = 0;
};

class IPluginImporter : public IPlugin
{
	public:
		virtual ~IPluginImporter () {};
		virtual bool Import (Data * pRoot) = 0;
};

class IPluginDataViewer : public IPlugin
{
	public:
		virtual ~IPluginDataViewer () {};
		virtual bool Preprocess (Data * pData) = 0;
		virtual bool View (Data * pData, HWND hwnd) = 0;
};

ํŠน์ • ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์ด๋Ÿฌํ•œ ํŠน์ˆ˜ ์œ ํ˜•์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ์ค‘ ํ•˜๋‚˜์—์„œ ์ƒ์†ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ผ๋ฐ˜์ ์ธ IPlugin ํ•จ์ˆ˜์™€ ํ•ด๋‹น ์œ ํ˜•์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ํ•ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜ ๋ชจ๋‘ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์œ„ ์ฝ”๋“œ ์˜ˆ์‹œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ตฌ์กฐ ์˜ˆ์‹œ

ํ”Œ๋Ÿฌ๊ทธ์ธ ๋กœ๋“œํ•˜๊ธฐ

์ง€๊ธˆ๊นŒ์ง€ ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์„ค๋ช…ํ–ˆ์ง€๋งŒ, ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€, ์ฆ‰ ๋Ÿฐํƒ€์ž„(Runtime)์— ์–ด๋–ป๊ฒŒ ๋กœ๋“œ๋˜๋Š”์ง€์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋Ÿฐํƒ€์ž„์— ๋กœ๋“œ๋˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ผ๋ถ€๊ฐ€ ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, ํ”„๋กœ๊ทธ๋žจ์ด ์ปดํŒŒ์ผ๋˜๋Š” ์ฆ‰์‹œ ์ƒˆ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
๋Œ€์‹  ๊ฐœ๋ณ„์ ์œผ๋กœ ์ปดํŒŒ์ผํ•œ ๋‹ค์Œ ์ฆ‰์‹œ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ดํ•ด๊ฐ€ ๋˜์…จ๋‚˜์š”? ์„ค๋ช…์ด ๋ถ€์กฑํ•ด ๋ณด์ด๋Š”๋ฐ์š”. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋ณ„๊ฐœ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ๊ณผ ์ ˆ์—ฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ปดํŒŒ์ผํ•œ๋‹ค๋Š” ๊ฒƒ์ด๊ณ , ๋”ฐ๋กœ ๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด์ฃ .

ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์ค‘ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋กœ๋“œํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์€ DLL(Dynamic Link Libraries)์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. DLL์„ ์‚ฌ์šฉํ•˜๋ฉด ๋Ÿฐํƒ€์ž„ ์ค‘์— ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์˜ ์ฝ”๋“œ์™€์˜ ์—ฐ๊ฒฐ์„ ์—ฐ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. DLL์„ ๋ช…์‹œ์ ์œผ๋กœ ๋กœ๋“œํ•  ๋•Œ๋งŒ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์ด์ฃ .

DLL์„ ๋งŒ๋“ค๋ ค๋ฉด Visual Studio์—์„œ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(DLL) ์ƒ์„ฑ์„ ์œ„ํ•œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ค€๋น„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ƒ์„ฑ๋œ ํŒŒ์ผ์ด ์‹คํ–‰ ํŒŒ์ผ(.exe)์ด๋‚˜ ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(.lib)๊ฐ€ ์•„๋‹Œ ๋™์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(.dll)๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. DLL์„ ์ƒ์„ฑํ•œ ํ›„์—๋Š” Export ํ•  function์„ ๊ฒฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋‹ฌ๋ฆฌ DLL์—์„œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์™ธ๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ ค๋Š” ํ•จ์ˆ˜, ํด๋ž˜์Šค ๋˜๋Š” ๋ณ€์ˆ˜์— ๋ช…์‹œ์ ์œผ๋กœ ํ”Œ๋ž˜๊ทธ๋ฅผ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ํด๋ž˜์Šค ์ž์ฒด๋ฅผ Export ํ•˜๋Š” ๋Œ€์‹ , ์‹ค์ œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ฐ์ฒด ์ƒ์„ฑ์„ ๋‹ด๋‹นํ•˜๋Š” ์ „์—ญ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋ฅผ Export ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ •์˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

#ifdef PLUGIN_EXPORTS
#define PLUGINDECL __declspec(dllexport)
#else
#define PLUGINDECL __declspec(dllimport)
#endif

extern "C" PLUGINDECL IPlugin * CreatePlugin (PluginManager & mgr);

C++๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ DLL์—์„œ ํ•จ์ˆ˜๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ ํ•จ์ˆ˜ ์„ ์–ธ ์ „์— ํ‚ค์›Œ๋“œ _declspee(dllexport)๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํ‚ค์›Œ๋“œ๋Š” PLUGINDECL๋กœ ์ •์˜๋ฉ๋‹ˆ๋‹ค. ๋ณดํ†ต DLL์„ ์ƒ์„ฑํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์œ„์™€ ๊ฐ™์ด ์ •์˜๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํ•˜๋‚˜์˜ ํ—ค๋” ํŒŒ์ผ๋กœ Export์™€ Import๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ๊ฒฐ์ •์ง“๋Š” ๊ฒƒ์€ ํ”„๋กœ์ ํŠธ์˜ ์ „์ฒ˜๋ฆฌ๊ธฐ์— PLUGIN_EXPORTS๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋Š”์ง€์ž…๋‹ˆ๋‹ค. ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉด Export๋กœ ๋™์ž‘ํ•  ๊ฒƒ์ด๊ณ , ์ •์˜๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด Import๋กœ ๋™์ž‘ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜์˜ ์„ ์–ธ์—์„œ extern "C"๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ์š”. ์ด ํ‚ค์›Œ๋“œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ผ๋ฐ˜์ ์ธ C++ ๋ฐฉ์‹์œผ๋กœ ์žฅ์‹ํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. C ํ•จ์ˆ˜์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๊พธ๋ฏธ์ง€ ์•Š์€ ์ฑ„๋กœ ๋‘๊ธฐ ์œ„ํ•จ์ด์ฃ . ๊ทธ ๊ฒฐ๊ณผ, ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ๋งน๊ธ€๋ง ๋œ(Mangled) ์ด๋ฆ„์ด ์•„๋‹Œ ์ผ๋ฐ˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‚˜์ค‘์— ๊ทธ ํ•จ์ˆ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฃผ์˜
 
 

C++์—์„œ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์— ๋”ฐ๋ผ ๊ฐ๊ฐ์˜ ๊ทœ์น™์œผ๋กœ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ๋ณ€๊ฒฝํ•˜๋Š”๋ฐ, ์ด๋ฅผ ๋„ค์ž„ ๋งน๊ธ€๋ง(Name Mangling)์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. extern "C"๋ฅผ ์„ ์–ธํ•˜๋ฉด ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ๋งน๊ธ€๋ง ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

์‚ฌ์น™์—ฐ์‚ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์˜ˆ์‹œ๋กœ, ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๊ตฌํ˜„์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

PLUGINDECL IPlugin *CreatePlugin(PluginManager &mgr)
{
	return new PluginAdd(mgr);
}

๋บ„์…ˆ์˜ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„์ฃผ ๊ฐ„๋‹จํ•˜์ฃ ?

PLUGINDECL IPlugin *CreatePlugin(PluginManager &mgr)
{
	return new PluginSub(mgr);
}

์—ฌ๊ธฐ๊นŒ์ง€, DLL์„ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์‚ฌ์šฉํ•  ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๋Š” ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ํŽธ๋ฆฌํ•œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ํŒŒ์ผ ์ด๋ฆ„์„ ๋ฐ”๊พธ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜ .dll ํ™•์žฅ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹ , ํ˜„์žฌ ํ”Œ๋Ÿฌ๊ทธ์ธ ์œ ํ˜•์„ ๋ฐ˜์˜ํ•˜๋Š” ํ™•์žฅ์ž๋กœ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‚ด๋ณด๋‚ด๊ธฐ๋กœ .exp ํ™•์žฅ์ž, ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ .imp ํ™•์žฅ์ž๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ด ์ž‘์€ ํŠธ๋ฆญ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ด€๋ฆฌํ•  ๋•Œ ๋งค์šฐ ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ ๋งค๋‹ˆ์ €

์ง€๊ธˆ๊นŒ์ง€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์–ด๋–ป๊ฒŒ ๋งŒ๋“ค์–ด์ง€๋Š”์ง€์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ–ˆ์ง€๋งŒ, ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ๊ทธ๋žจ์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋กœ๋“œํ•˜๊ณ  ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ ๋งŒ ์„ค๋ช…ํ–ˆ๋Š”๋ฐ์š”. ์ด๋Ÿฌํ•œ ์ž‘์—…์€ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋งค๋‹ˆ์ €์˜ ์—ญํ• ์ž…๋‹ˆ๋‹ค.

ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์„ค๊ณ„ ๊ฒฐ์ •์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ •ํ™•ํžˆ ๋ถˆ๋Ÿฌ์™€์ง€๋Š” ์‹œ์ ์ž…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์„ ์‹œ์ž‘ํ•˜๋Š” ์ฆ‰์‹œ ๋กœ๋“œ๋˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๋“œํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ๊ฐœ๋ณ„ ํ”Œ๋Ÿฌ๊ทธ์ธ๋งŒ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํ”„๋กœ๊ทธ๋žจ์€ ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋  ๋•Œ๋งˆ๋‹ค ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋กœ๋“œํ•˜๋ ค๊ณ  ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฅธ ์‹œ๊ฐ„์— ์˜ฌ๋ฐ”๋ฅธ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋งค๋‹ˆ์ € ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

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

ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋กœ๋“œํ•˜๊ธฐ ์œ„ํ•œ ์ฒซ ๋‹จ๊ณ„๋Š” DLL์„ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

HMODULE hDll = ::LoadLibrary(filename.c_str());

LoadLibrary ํ•จ์ˆ˜๋Š” ํŒŒ์ผ ์ด๋ฆ„์— ๋”ฐ๋ผ dll์„ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. DLL์„ ํ•ด์ œํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜์ค‘์— ์‚ฌ์šฉ๋  ํ•ธ๋“ค์„ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜, DLL์„ ๋กœ๋“œํ•˜๋Š” ๋™์•ˆ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒฝ์šฐ NULL์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋‹ค๋ฅธ ์ž„์˜ ํŒŒ์ผ์˜ ํ™•์žฅ์ž๊ฐ€ ์ฐพ๊ณ  ์žˆ๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ๊ณผ ๊ฐ™๊ฑฐ๋‚˜ ํŒŒ์ผ์ด ์†์ƒ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ชจ๋“  ๋‹จ๊ณ„์—์„œ ๊ฒฐ๊ณผ๊ฐ€ ์„ฑ๊ณต์ ์ด์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋‹จ๊ณ„๋Š” DLL์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋กœ๋“œ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ , Export ํ•œ ํŒฉํ† ๋ฆฌ ํ•จ์ˆ˜๋ฅผ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

CREATEPLUGIN pFunc = (CREATEPLUGIN)::GetProcAddress(hDLL, _T("CreatePlugin"));

GetProcAddress ํ•จ์ˆ˜๋Š” ํŠน์ • DLL์—์„œ Export ํ•œ ํ•จ์ˆ˜ ๋ชฉ๋ก์—์„œ ํŠน์ • ํ•จ์ˆ˜๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ ์ฐพ์œผ๋ฉด, GetProcAddress๋Š” ํ•ด๋‹น ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด NULL์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ์ด๋Š” DLL์— ํ•จ์ˆ˜๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์–ป์–ด์ง„ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์— ํ”Œ๋Ÿฌ๊ทธ์ธ ๋งค๋‹ˆ์ €์— ๋Œ€ํ•œ *this ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ, ํ•ด๋‹น ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

IPlugin *pPlugin = pFunc(*this);

ํ”Œ๋Ÿฌ๊ทธ์ธ ๋กœ๋“œ(Load) ๋ฐ ์–ธ๋กœ๋“œ(Unload)

๋Ÿฐํƒ€์ž„ ์ค‘ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋กœ๋“œ ๋ฐ ์–ธ๋กœ๋“œ ํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์ข…๋ฃŒ๋  ๋•Œ ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์–ธ๋กœ๋“œ ํ•˜์—ฌ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์ œ๋˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ•ด์ œํ•˜๋ ค๋ฉด ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ชฉ๋ก์—์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ œ๊ฑฐํ•˜๊ณ , ์‹ค์ œ ๊ฐœ์ฒด๋ฅผ ์‚ญ์ œํ•œ ๋‹ค์Œ, FreeLibrary๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ํ•ด๋‹น DLL์„ ์–ธ๋กœ๋“œ ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. DLL์„ ์–ธ๋กœ๋“œ ํ•˜๋Š” ํ•จ์ˆ˜๋Š” LoadLibrary๊ฐ€ ๋ฐ˜ํ™˜ํ•œ DLL ํ•ธ๋“ค์„ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ํ•ธ๋“ค์„ ํ”Œ๋Ÿฌ๊ทธ์ธ ํฌ์ธํ„ฐ ์ž์ฒด์™€ ํ•จ๊ป˜ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜๋Š”, ํ”„๋กœ๊ทธ๋žจ ์ž์ฒด๋ฅผ ์ข…๋ฃŒํ•˜์ง€ ์•Š๊ณ  ๋ชจ๋“  ํ”Œ๋Ÿฌ๊ทธ์ธ(๋˜๋Š” ํŠน์ • ํ”Œ๋Ÿฌ๊ทธ์ธ๋งŒ)์„ ๋‹ค์‹œ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋ฐ์ดํ„ฐ ์„ธํŠธ๋ฅผ ๋กœ๋“œํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ, ๋ฐ˜๋ณตํ•ด์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ…Œ์ŠคํŠธํ•  ๋•Œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋˜์–ด LoadLibrary ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด DLL์ด ๋กœ๋“œ๋˜๋ฉด ํ•ด๋‹น ํŒŒ์ผ์ด ์šด์˜์ฒด์ œ์— ์˜ํ•ด ์ž ๊ธฐ๋ฏ€๋กœ, ์ƒˆ ๋ฒ„์ „์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์–ธ๋กœ๋“œ ํ•˜๊ณ  DLL์„ ์—…๋ฐ์ดํŠธํ•œ ํ›„ ๋‹ค์‹œ ๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ, ๋กœ๋“œ ๋ฐ ์–ธ๋กœ๋“œ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ํ˜ธ์ถœ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

๋ณธ๋ฌธ์˜ ๋‚ด์šฉ์ด ๊ฝค ๊ธธ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ณธ๋ฌธ์˜ ๋‚ด์šฉ๋งŒ ๋ณด๋ฉด '๊ทธ๋ž˜์„œ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋งˆ๋ƒฅ ์ข‹์€๊ฐ€?'๋ผ๋Š” ์˜๋ฌธ์ด ๋‚จ๋Š”๋ฐ์š”. ๋Œ€๋‹ต์€ '์•„๋‹ˆ๋‹ค'์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช… ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์‚ฌ์šฉํ•œ ๋‹จ์ ๋„ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๊ธฐ๋ฒ•์ด ์žˆ๊ณ , ์›๋ณธ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ํ”„๋กœ๊ทธ๋žจ์„ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์žฅ์ ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ตณ์ด ๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ์— ์˜จ๊ฐ– ๊ธฐ๋Šฅ์„ ๋‹ค ๊ตฌํ˜„ํ•˜๋ฉด์„œ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์˜๋ฏธ์ด์ฃ .

ํ”Œ๋Ÿฌ๊ทธ์ธ ์‚ฌ์šฉ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•, ๋‹ค์–‘ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•, ๊ด€๋ฆฌ ๋ฐฉ๋ฒ•, Windows ํ”Œ๋žซํผ์— ๋กœ๋“œํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ธฐ์–ตํ•œ๋‹ค๋ฉด ์–ธ์  ๊ฐ€ ํฐ ๋„์›€์ด ๋  ๊ฑฐ๋ผ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ExamPlugin.zip
0.14MB

๋ฐ˜์‘ํ˜•