๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT-Engineering/C++

DLL ๋งŒ๋“ค๊ธฐ ๋ฐ ํ˜ธ์ถœํ•˜๊ธฐ ๋”ฐ๋ผํ•˜๊ธฐ : 2. ๋ช…์‹œ์  ๋งํ‚น

by ๐Ÿงž‍โ™‚๏ธ 2017. 2. 3.
๋ฐ˜์‘ํ˜•

1์žฅ. ๋ฌต์‹œ์ (์•”์‹œ์ ) ๋งํ‚น์— ์ด์–ด์„œ ์ด๋ฒˆ์—” ๋ช…์‹œ์  ๋งํ‚น์— ๋Œ€ํ•œ ๋”ฐ๋ผํ•˜๊ธฐ๋ฅผ ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜๊ฒ ๋‹ค.

๋ช…์‹œ์  ๋งํ‚น์„ ์ด์šฉํ•˜๋ฉด ํ•„์š”ํ•  ๋•Œ DLL์—์„œ ํ•จ์ˆ˜๋ฅผ ๋กœ๋“œํ•˜์—ฌ ํŠน์ • ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์— ์‚ฌ์šฉํ•˜๋ ค๋Š” ํ•จ์ˆ˜๋ฅผ

๋งตํ•‘์‹œ์ผœ์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์‹ฌ์ง€์–ด ํ•˜๋‚˜์˜ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์— ๋ถˆ๋Ÿฌ๋“ค์ผ ํ•จ์ˆ˜๋ฅผ ๋ฐ”๊ฟ”๊ฐ€๋ฉฐ ๋งตํ•‘์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค.


๋ฐฑ๋ฌธ์ด ๋ถˆ์—ฌ์ผ๊ฒฌ์ด๋ผ ํ–ˆ์œผ๋‹ˆ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ๋ณด๋ฉด์„œ ์„ค๋ช…ํ•˜๊ฒ ๋‹ค.

์‹œ์ž‘์€ 1์žฅ์—์„œ์˜ MakeDLLTutorial.cppํŒŒ์ผ์˜ '๋ง‰ ์ƒ์„ฑํ•˜์—ฌ ์•„๋ฌด๊ฒƒ๋„ ์—†๋Š” ๋ฒ„์ „'๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘๋œ๋‹ค.

http://gentlesark.tistory.com/11 ๊ธ€์˜ 6๋ฒˆ ํ•ญ๋ชฉ๊นŒ์ง€ ๋งˆ์นœ๋’ค 7๋ฒˆ ํ•ญ๋ชฉ ๋Œ€์‹  ์ง€๊ธˆ๋ถ€ํ„ฐ ์ง„ํ–‰๋˜๋Š” ์„ค๋ช…์„ ๋”ฐ๋ผ๊ฐ€๋ฉด ๋œ๋‹ค.

mainํ•จ์ˆ˜ ๋ฐ”๋กœ ์ƒ๋‹จ์— ์•„๋ž˜์™€ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์ž.

typedef int(*pDLLFunction)(int, int);
pDLLFunction pFunction = NULL;

pDLLFunction์ด๋ผ๋Š” ํ•จ์ˆ˜ ํฌ์ธํ„ฐ ์ž๋ฃŒํ˜•์„ ์„ ์–ธํ•˜๊ณ ,

pFunction์ด๋ผ๋Š” ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ๋งŒ๋“ค๊ณ , ์ด๋ฅผ NULL๋กœ ์ดˆ๊ธฐํ™”ํ–ˆ๋‹ค.

์ด์ œ ์ด pFunction์ด๋ผ๋Š” ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์— ์™ธ๋ถ€ DLL์˜ ํ•จ์ˆ˜๋ฅผ ๋งตํ•‘์‹œํ‚ฌ ๊ฒƒ์ด๋‹ค.

int a = 5;
int b = 10;
HMODULE hMod = NULL;
hMod = LoadLibraryA("MakeDLLTutorial.dll");
if (hMod == NULL)
{
	printf("DLL Load Failed.\n");
	return 0;
}

์ด์ „ ๊ธ€๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ a, b๋ผ๋Š” ์ •์ˆ˜๋ฅผ ์„ ์–ธ ๋ฐ ๊ฐ๊ฐ 5, 10์œผ๋กœ ์ •์˜ํ•˜์˜€๋‹ค.

์ด๋ฒˆ์—” dll๋ฅผ ๋‹ด์•„๋‘˜ ์ˆ˜ ์žˆ๋Š” ์ž๋ฃŒํ˜•์ธ HMODULE์ด๋ผ๋Š” ์ž๋ฃŒํ˜•์„ ์ด์šฉํ•˜์—ฌ hMod๋ผ๋Š” ๋†ˆ์„ ์„ ์–ธํ•˜๊ณ  ์ •์˜ํ•œ ๋’ค์—

1์žฅ์—์„œ ๋งŒ๋“ค์–ด๋‘์—ˆ๋˜ MakeDLLTutorial.dll์„ ๋ถˆ๋Ÿฌ๋“ค์ธ๋‹ค. ์ด ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜๊ฐ€ LoadLibraryA()๋ผ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

์ด ํ•จ์ˆ˜๋Š” dllํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ๋“ค์ด์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ NULL์„ ๋ฆฌํ„ดํ•˜๋ฉฐ, ์ด ๊ฒฝ์šฐ์— ๋Œ€ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค.

์ด์ œ dllํŒŒ์ผ์ด ๋ถˆ๋Ÿฌ๋“ค์—ฌ์กŒ๋‹ค๋ฉด, ํ•ด๋‹น dllํŒŒ์ผ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ํ˜ธ์ถœํ•˜๊ณ ์ž ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ๋“ค์—ฌ์•ผ๊ฒ ๋‹ค.

1์žฅ์—์„œ ๋งŒ๋“ค์–ด ๋‘์—ˆ๋˜ AddInt์™€ MultIntํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ๋“ค์ด์ž.

pFunction = (pDLLFunction)GetProcAddress(hMod, "AddInt");
printf("sum = %d \n", pFunction(a, b));
pFunction = (pDLLFunction)GetProcAddress(hMod, "MultInt");
printf("mult = %d \n", pFunction(a, b));

์ฒซ๋ฒˆ์งธ ์ค„์€ pFunction์— pDLLFunctionํƒ€์ž…์˜ ํ•จ์ˆ˜์ธ AddInt๋ผ๋Š” ์ด๋ฆ„์˜ ํ•จ์ˆ˜๋ฅผ hMod๋ผ๋Š” dll๋กœ๋ถ€ํ„ฐ ๋ถˆ๋Ÿฌ๋“ค์ธ๋‹ค๋Š” ๋œป์œผ๋กœ,

๊ทธ ํ•จ์ˆ˜๋ช…์€ GetProcAddress๊ฐ€ ๋˜๊ฒ ๋‹ค. ๋‘๋ฒˆ์งธ์ค„์€ ์ด ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด a, b๋ฅผ ๋„˜๊ฒจ ๋ฆฌํ„ด๋˜๋Š” ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

3, 4๋ฒˆ์ค„๋„ ๊ฑฐ์˜ ์œ ์‚ฌํ•œ ์˜๋ฏธ์ด๋‹ˆ ์ž์„ธํ•œ ์„ค๋ช…์€ ์ƒ๋žตํ•œ๋‹ค.

์™„์„ฑ๋œ ์ฝ”๋“œ์˜ ๋ชจ์Šต์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค. ์ž ๊ทธ๋Ÿผ ์ด์ œ ๋˜‘๊ฐ™์ด ์‹คํ–‰๋˜๋Š”์ง€ ๋ณด์ž. F7์„ ๋ˆŒ๋Ÿฌ ์‹คํ–‰ํ•ด๋ณด์ž.

์–ด๋ผ ์–ด์ฉ์ง€ ๋ฐ‘์ค„์ด ์ˆ˜์ƒํ•˜๋”๋ผ๋‹ˆ ๋นŒ๋“œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค. ์™œ์ผ๊นŒ? ์—๋Ÿฌ์—์„œ ๋ณด์ด๋Š”๋Œ€๋กœ ํ•ด๋‹น ์‹๋ณ„์ž๋“ค์„ ํฌํ•จํ•˜๋Š” ํ—ค๋”๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‹๋ณ„์ž๋“ค์„ ์ดํ•ดํ•  ์ˆ˜ ์—†์—ˆ๋˜ ๊ฒƒ. stdafx.h๋ฅผ ๋ถˆ๋Ÿฌ๋“ค์ด๋Š” ๋ฐ”๋กœ ์•„๋žซ์ค„์— ๋‹ค์Œ์˜ ํ•œ์ค„์„ ์ถ”๊ฐ€ํ•˜์ž.

#include <windows.h>

๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ F7์„ ๋ˆŒ๋Ÿฌ ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ด๋ณด์ž. ๋นŒ๋“œ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ๋‹ค.

๋ฏธ๋ฆฌ ์„ ์–ธ๋œ ํ—ค๋”๋ฅผ ๋ถˆ๋Ÿฌ๋“ค์ธ ์ดํ›„์— ๊ผญ windows.h๋ฅผ ๋ถˆ๋Ÿฌ๋“ค์ด๊ธธ ๋ฐ”๋ž€๋‹ค. ์ฃผ์˜ํ•˜์ž.

๊ทธ๋Ÿผ ์ด์ œ Ctrl+F5๋ฅผ ๋ˆŒ๋Ÿฌ ์ž˜์‹คํ–‰๋˜๋Š”์ง€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•ด๋ณด์ž.

์˜ฌใ…‹ ์•„์ฃผ ์ž˜ ๋˜๋Š”๊ตฐ.

์ด๋กœ์จ ๊ธฐ๋ณธ์ ์ธ DLL ์ž‘์„ฑ๊ณผ ํ˜ธ์ถœํ•˜๊ธฐ ๋”ฐ๋ผํ•˜๊ธฐ๋Š” ๋งˆ๋ฌด๋ฆฌ ๋˜์—ˆ๋‹ค. ๋„ˆ๋ฌด ์‹ฌํ”Œํ•˜๊ฒŒ ํ•ด์„œ ์ดˆ๋ณด์ž๋“ค์กฐ์ฐจ๋„ ์•„์‰ฌ์šธ์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค.

ํ•˜์ง€๋งŒ ์ดˆ๋ณด์ž๋“ค์„ ์œ„ํ•œ ๊ฒƒ์ด๋‹ˆ๊นŒ ํ•„์ž๋Š” ์ด์ •๋„๋กœ ๋งŒ์กฑํ•˜๊ฒ ๋‹ค.

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€