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 |
300 | 영준아,나야 나 1 | 정우아범 | 2003.02.26 | 1222 |
299 | 3번째 라미 산란일기... | 까만롤빵 | 2003.03.09 | 1221 |
298 | 헉헉헉...^^;; 3 | 김준구 | 2003.11.27 | 1221 |
» | .dll .h .lib의 차이... ^^;;; | 까만롤빵 | 2004.11.02 | 1220 |
296 | 이 놈은 비타 암컷이 맞남..? 3 | 지원아빠 | 2004.05.22 | 1219 |
295 | 빵님께 부탁!!^&^ 7 | 김준구 | 2003.10.01 | 1219 |
294 | 독일의 날씨는 알다가도 모르겠습니다... | 까만롤빵 | 2005.03.12 | 1217 |
293 | 연수기 수질 테스트... | 까만롤빵 | 2003.03.30 | 1217 |
292 | 안녕하세요. 롤빵님. | 손남규 | 2003.02.26 | 1216 |
291 | 빵님에 대한 복수전3!!(빵님!!메~~~~렁!!!) 6 | 김준구 | 2003.10.01 | 1215 |
290 | Merry X-Mas | 오빠 | 2002.12.24 | 1215 |
289 | 축하해 | 아미 | 2002.12.24 | 1215 |
288 | 헤헤... 홈씨어터도 완성하고... 컴터 업글도 끝냈습니당... 5 | 까만롤빵 | 2004.10.10 | 1214 |
287 | 오랜만에..^^.. 2 | 아연이 | 2006.04.24 | 1213 |
286 | 처음 공개합니돵... 4 | 까만롤빵 | 2005.05.12 | 1212 |