2004.11.02 16:55
.dll .h .lib의 차이... ^^;;;
조회 수 1220 추천 수 0 댓글 0
우선 자주 쓰이는 내용을 따로 묶은 것은 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할 때 필요합니다.
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할 때 필요합니다.
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
공지 | 캐논렌즈 모음 | 까만롤빵 | 2007.08.12 | 2753 |
공지 | 안녕하세요... 환영합니다... | 까만롤빵 | 2002.12.24 | 1578 |
420 | 가입인사!꾸벅(--)(__)(--)(^&^) 2 | 김준구 | 2003.09.01 | 1249 |
» | .dll .h .lib의 차이... ^^;;; | 까만롤빵 | 2004.11.02 | 1220 |
418 | 100% 완료.... 1 | 까만롤빵 | 2004.05.19 | 1279 |
417 | 10년간 동고동락했던 친구들.... 3 | 까만롤빵 | 2004.07.05 | 1102 |
416 | 1년 반동안 동고동락했던... 3 | 까만롤빵 | 2004.06.18 | 1081 |
415 | 1자반을 처분했습니다.... | 까만롤빵 | 2003.03.16 | 1189 |
414 | 2018년 러시아 월드컵. 스페인 vs 포르투갈 | 까만롤빵 | 2018.06.16 | 167 |
413 | 2018년 프로야구 개막 | 까만롤빵 | 2018.03.25 | 157 |
412 | 2년간의 기억을 지웠습니다. 2 | 까만롤빵 | 2007.03.07 | 1256 |
411 | 2자반 수초어항을 새로 세팅했습니당... ^^;;; | 까만롤빵 | 2003.06.04 | 1257 |
410 | 2자반 자작어항 만들기... | 까만롤빵 | 2002.12.24 | 1284 |
409 | 3번째 라미 산란일기... | 까만롤빵 | 2003.03.09 | 1221 |
408 | 3월 초에 있었던 낭후 봄소풍... ^^;;; | 까만롤빵 | 2003.03.30 | 1145 |
407 | 4년간 정들었던 친구를 떠나보냈습니다. | 까만롤빵 | 2009.04.05 | 1611 |
406 | 550EX 2 | 까만롤빵 | 2004.07.20 | 1156 |