잉여력 dev/Windows CE

Dynamic Link Library

욱_스 2008. 5. 12. 13:13

참조하는 프로그램에 정적 라이브러리가 아닌 동적 링크를 사용하게 해준다.
기존의 정적 라이브러리와는 달리 컴파일 시에 참조하는 함수의 코드가 실행 파일로
복사되는 것이 아니라 실행 중에 라이브러리에 있는 함수를 호출 하게된다.

단점 : 만들는 과정이 복잡하며,(DLL 까지 만들어줘야 하는경우)
         프로그램 자체가 DLL에 의지하여 실행하는 독립적이지 못한 상태가 되고,
         DLL 이 없거나 손상될 경우 프로그램 실행이 불가능하다.

장점 : 여러 프로그램에서 한 DLL을 동시 사용하기에 메모리가 절약된다.
         같은 DLL을 사용하는 여러 프로그램이 동시에 실행되도 DLL은 딱 한번만 실행되면 되며,
         DLL을 사용하는 프로그램 자체의 크기가 작아진다.
         참조하는 DLL 내의 알고리즘이 개선되면 각각의 프로그램의 성능 또한 같이 개선된다.
         다국어 지원 리소스로 쉽게 교체도 가능하다.

* DLL 내부의 코드의 경우는 최초 호출시에 한번만 실행된다.
  단, DLL 내의 고유 변수 등은 사용하는 프로그램이 호출시에 다시 메모리를 할당받는다.
  ! 각 프로그램간 DLL 내부의 값 자체를 공유하지는 못한다.

-DLL의 연결방법-
1. 묵시적(Implicit)연결 : 프로그램이 실행될 때 DLL이 로드됨 (Load time Linking - 실행시 연결)
                                  함수가 어느 DLL에 있는지 밝히지 않고 사용.
                                  윈도우가 알아서 DLL을 로딩해주고 사용하는 모든 프로그램이 종료가 되어
                                  사용 카운트가 0이되면 알아서 DLL을 언로딩해준다.
                                  프로젝트내에서 임포트 라이브러리 해줘야한다.

2. 명시적(Explicit)연결 : 프로그램이 실행될 때 DLL이 로드되지않고
                                  사용자가 DLL을 로드 하라는 명령을 했을 때 로드된다.
                                  (Run time Linking - 실행중 연결)
                                  다국어 같은 다양한 리소스를 사용할 때 선택적으로 같은 리소스를 가지고 있으나
                                  언어 설정이 다른 DLL을 실시간으로 교체 하는 방법에 응용이 가능할 듯하다.
 
                                  프로젝트 내에서 임포트 라이브러리를 해주지 않아도 된다.

* HINSTANCE LoadLibrary(LPCTSTR lpLibFileName);
* FARPROC GetProcAddress(HMODULE hModule, LPCSTR lpProcName);
  ( DLL에서 export한 함수의 번지를 찾아 그 함수의 함수 포인터를 리턴해 준다. )
* BOOL FreeLibrary(HMODULE hLibModule);
  ( DLL의 사용 카운트를 -1 해주고 카운트가 0이 되면 DLL을 메모리에서 삭제한다. )