|
dll을 이용하는 것은 시스템 리소스를 보다 원할하게 사용하고자 할 때, 타 프로그램과 동일한 자료를 공유하고자 할 때, 혹은 해당되는 기능을 구현하기 위해 어쩔 수 없이 사용하게 되는데요.
dll을 내 프로그램에 연결시키는 방법은 두가지가 있습니다.
1. 정적링크
현재 만들고 계신 방법이 이 방법에 해당합니다. 정적링크는 프로그램이 실행될 때 함께 메모리상에 로드되어 사용되고, 프로그램이 죽으면 함께 메모리상에서 내려집니다(제거됩니다). 이 방법의 장점은 소스코딩이 간단하다는 것. 하지만 dll 내에 export되어진 함수나 자료를 사용하지 않을 때도 계속적으로 메모리 상에 상주하기 때문에 자원의 낭비가 좀 있습니다.
만드는 방법은,
dll 소스
a.c------------------------------------
리턴타입 CALLBACK 함수명 (파라미터인자)
{
함수내용
}
a.h------------------------------------
리턴타입 __import 함수명 (파라미터인자);
그리고 실행프로그램쪽에서
프로젝트 내에 lib를 첨가하고, dll 내의 자원을 사용하는 곳에 a.h를 포함시킵니다.
이러면 무난히 처리될 것입니다.
2. 동적링크
동적링크는 프로그램을 실행할 때, dll이 함께 메모리상에 로드되는 것이 아니라 LoadLibrary라는 함수를 사용하여 프로그램 내에 필요한 곳에서 코딩하여 호출하는 방식입니다. 이렇게 할 경우, 정적링크와 반대로, 코딩은 복잡해지지만, 실제 사용시 메모리 사용효율이 높습니다.
만드는 방법은,
dll 소스
a.c------------------------------------
extern "C" __export __stdcall 리턴타입 함수명 (파라미터인자)
{
함수내용
}
실행프로그램쪽-------------------------
1. dll load
리턴타입 (__stdcall *함수명) (파라미터인자);
HANDLE dll = LoadLibrary ("dll명.dll");
함수명 = (리턴타입 (__stdcall*)(파라미터인자)) GetProcAddress (dll, "함수명");
이렇게 하신 후, 함수명이 NULL이 아니면 함수를 호출하여 사용하시면 됩니다.
2. dll unload
FreeLibrary (dll);
이렇게 하시면 동적링크가 됩니다.
제가 너무 대충대충 설명해서 좀 그런데, 혹 이해 않되시는 부분이 있으면 리플 달아 주세요.
초식수련자 님이 쓰신 글 :
: DLL 을 만든후에 새로운 프로그램으로 DLL 파일의 헤더파일을 인클루드하는 방법으로
:
: 프로그램을 만들었는데요..
:
: 프로젝트파일소스코드에
: USERES("**.res");
: USEFORM("Unit1.cpp",Form1);
: USELIB("**Dll.Lib");
: 의 내용을 덧붙이고
:
: Unit1.cpp 에 DLL의 헤더파일을 인클루드시킨후
: 버튼으로 DLL 의 함수를 호출해서 컴파일시켰는데 항상.. 계속...
:
: [Linker Error]Unresolved external '함수명' referenced From C:\..\UNIT1.obj
:
: 이라는 에러가 자꾸 나는군요.. 도무지 알길이 없어 이렇게 글을 올립니다.
:
: 부탁드립니다.
|