[C++] ํ๋ฌ๊ทธ์ธ ๊ตฌ์กฐ๋ก ํ๋ก๊ทธ๋จ ํ์ฅํ๊ธฐ (์์ ํฌํจ)
๋ณธ๋ฌธ์ ๋ด์ฉ์ 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 ์ดํด๋ณด๊ธฐ!
์ด๋ฒ ํฌ์คํ ์์๋ ํ๋ฌ๊ทธ์ธ์ ๊ฐ๋ ๊ณผ ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋๋ก ํ๋ก๊ทธ๋จ์ ์ค๊ณํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์๊ฐํฉ๋๋ค.
ํ๋ฌ๊ทธ์ธ์ ํ์์ฑ
๋ณดํต ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ํน์ ๊ธฐ๋ฅ์ด ์ ๊ณต๋์ง ์์ ์์ฌ์ธ ๋๊ฐ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ด๋ฐ ์๊ฐ์ ํ๋ ์ฌ์ฉ์๋ค์ด ๊ฝค ๋ง์ ๊ฒ์ ๋๋ค. ๊ฐ๋ฐ์๋ค์ด ๊ทธ๋ฐ ๊ธฐ๋ฅ๋ค์ ๋ฏธ๋ฆฌ ์์ํ๊ธด ํ๋ค์ง๋ง, ๋ง์ฝ ๊ทธ๋ฐ ๊ธฐ๋ฅ๋ค์ ํ๋ก๊ทธ๋จ ์์ ๋ชจ๋ ๋ฃ์ผ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? ํ๋ก๊ทธ๋จ์ ์์ฒ ๊ฐ์ง์ ๋ค๋ฅธ ๊ธฐ๋ฅ๋ค๋ก ์ธํด ์ ์ง ๋ถ๊ฐ๋ฅํ ํ๋ก๊ทธ๋จ์ผ๋ก ํด๋ณดํ๊ณ , ํฌ๊ธฐ์ ๊ธฐ๋ฅ์ ๋ถํ์ํ๊ฒ ๊ฑฐ๋ํด์ง ๊ฒ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ์๋ฌด๋ ์ฌ์ฉํ๊ณ ์ถ์ด ํ์ง ์์ ๋ธ๋กํธ ์จ์ด(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 ํ๋ซํผ์ ๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ๊ธฐ์ตํ๋ค๋ฉด ์ธ์ ๊ฐ ํฐ ๋์์ด ๋ ๊ฑฐ๋ผ ์๊ฐํฉ๋๋ค.
'Programming > C++' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๊ธ
์ด ๊ธ ๊ณต์ ํ๊ธฐ
-
๊ตฌ๋
ํ๊ธฐ
๊ตฌ๋ ํ๊ธฐ
-
์นด์นด์คํก
์นด์นด์คํก
-
๋ผ์ธ
๋ผ์ธ
-
ํธ์ํฐ
ํธ์ํฐ
-
Facebook
Facebook
-
์นด์นด์ค์คํ ๋ฆฌ
์นด์นด์ค์คํ ๋ฆฌ
-
๋ฐด๋
๋ฐด๋
-
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
๋ค์ด๋ฒ ๋ธ๋ก๊ทธ
-
Pocket
Pocket
-
Evernote
Evernote
๋ค๋ฅธ ๊ธ
-
[C++ DLL] Visual Studio C++ ๋ช ์์ ๋งํฌํ๊ธฐ (์์ ํฌํจ)
[C++ DLL] Visual Studio C++ ๋ช ์์ ๋งํฌํ๊ธฐ (์์ ํฌํจ)
2020.12.10 -
[C++ DLL] Visual Studio C++ ์์์ ๋งํฌํ๊ธฐ (์์ ํฌํจ)
[C++ DLL] Visual Studio C++ ์์์ ๋งํฌํ๊ธฐ (์์ ํฌํจ)
2020.12.07 -
[C++ DLL] Visual Studio C++ DLL ์์ฑํ๊ธฐ (์์ ํฌํจ)
[C++ DLL] Visual Studio C++ DLL ์์ฑํ๊ธฐ (์์ ํฌํจ)
2020.12.04 -
[C++ DLL] ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ดํด
[C++ DLL] ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์ดํด
2020.11.28