본문 바로가기
조회 수 1220 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 수정 삭제
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄 수정 삭제
우선 자주 쓰이는 내용을 따로 묶은 것은 dll입니다.

dll에는 function이나 혹은 class 정도가 들어가있게 됩니다.

쉽게 얘기해서 code가 build되어 들어있습니다.

그런데 그 dll을 쓰려면 어떤 내용이 있는지를 알아야 합니다.

void test(); 라는 함수가 test.dll에 있는데 그걸 쓰려는 사람은 void test();라는 함수가 거기 있다는 사실을 알아야 하겠죠.

그걸 사용하려면 그저 test라는 function의 type을 선언하고 그 dll을 load한 후 그 함수의 pointer를 뽑아내면 됩니다.

msdn의 예를 보여 드리죠.



typedef VOID (*MYPROC)(LPTSTR);

VOID main(VOID)
{
HINSTANCE hinstLib;
MYPROC ProcAdd;
BOOL fFreeResult, fRunTimeLinkSuccess = FALSE;

// Get a handle to the DLL module.

hinstLib = LoadLibrary("myputs");

// If the handle is valid, try to get the function address.

if (hinstLib != NULL)
{
ProcAdd = (MYPROC) GetProcAddress(hinstLib, "myPuts");

// If the function address is valid, call the function.

if (fRunTimeLinkSuccess = (ProcAdd != NULL))
(ProcAdd) ("message via DLL function\n");

// Free the DLL module.

fFreeResult = FreeLibrary(hinstLib);
}

// If unable to call the DLL function, use an alternative.

if (! fRunTimeLinkSuccess)
printf("message via alternative method\n");
}



myputs.dll에서 "void myPuts( LPTSTR )"라는 함수를 이끌어내서 사용하죠.

그렇다면 결국 dll만 알고 어떤 함수가 있는지만 알면 dll을 충분히 사용할 수 있다는 말이 됩니다.

즉, 님이 질문에서 적으신 lib나 h는 전혀 필요가 없다는 말이죠.



그런데 말이죠.. 그 함수가 만약 sdk에서의 함수처럼 수백개, 수천개라면?

일일이 그 dll쓰려고 할 때마다 getprocaddress 일일이 해줘야 할까요?

그럴 순 없겠죠? 엄청난 시간 낭비가 되겠죠.

그래서 함수 선언부를 미리 알려줍니다. ( 몸체는 dll 안에 있겠죠.. )

.h, 즉 header에 그런 걸 보통 기록해서 공유하게 됩니다.

선언부를 알면 coding이 가능하죠. ( compile이 가능하다는 얘기.. )

그런데 함수 선언부를 안다해도 getprocaddress를 안하는 건 아니죠.

그럴 땐 .lib를 씁니다.

dll 어디에 test()라는 함수가 있고, test2()는 어디에 있고 등등의 정보를 .lib에 기록해두는 거죠.

그래서 .h와 .lib를 주면 다른 사람들이 해당 dll에 관해 "linking"을 할 수 있게 되는 거죠.

linking하는 방법은 여러가지가 있습니다...

전에 어떤 분이 질문하셨는데.. #pragma comment 로 할 수도 있구요..

project settings에서 link tab에서 할 수도 있구요..



말이 또 길어졌네요. --;

결론은.. dll에는 function같은 code들이 있고, 이를 사용하기 위해 h와 lib가 보통 필요하게 됩니다.

h는 compile ( syntax )할 때 필요하며, lib는 link할 때 필요합니다.