DLL ?
DLL은 dynamic link library의 약자로 동적 링크 라이브러리를 뜻한다. 초기에 여러 프로그램을 실행할때 메모리가 부족하게 되었다고 했다. 그래서 생각해낸 대안으로 DLL이 나오게 되었는데, DLL은 평소 중요하지 않은 것들을 저장해놓고 필요할때마다 불러 쓰는 원리를 이용한 것이다.
예를들어 C에서 stdio.h 파일을 포함하여 컴파일은 한다. stdio.h 헤더파일 안에는 scanf, printf등과 같은 함수들이 있고, 필요한 기능들이 실행파일에 합쳐져 실행파일의 크기가 증가하게 된다. 그런데 만일 이 헤더파일을 include하지 않고 모든 프로그램마다 일일이 써준다고 생각한다면, 헤더파일의 크기를 만일 10KB라고 했을때 10개의 프로그램을 동시에 실행시키면 최소한 100KB가 나온다.(10개*10KB) 하지만 include함으로써 10개를 실행시키든 100개를 실행시키든 10KB의 메모리가 필요하고 나머지 프로그램에서는 필요할때마다 stdio.h에서 함수를 가져다 사용하면 되는 것이다.
MS는 윈도우의 모든 기능을 DLL에 담아 배포하며, 이렇게 운영체제의 기능을 DLL에 담아 배포하고 프로그램이 동적으로 연결해 사용하는 방식을 WinAPI라고 한다. 또한 DLL이 C함수와 같은 방식이기 때문에 WinAPI는 기본적으로 C언어를 표준으로 사용함.
DLL은 두가지 형태로 프로그램에 링크된다.
바로 정적링크와 동적링크인데, 먼저 정적링크를 알아보자.
정적링크 : Lib로 빌드되며 프로그램 빌드시에 같이 빌드가 되면서 해당 프로그램의 일부가 된 다. 속도는 동적링크보다 빠르지만 크기가 커진다는 단점이 존재하며, 공유하지 않음. 프로그램 빌드시에 프로그램에 포함되기 때문에 실행할때 LIB의 필요가 없다.
동적링크 : DLL로 빌드되며 프로그램의 빌드시에 DLL안의 함수선언만 있으면 된다.속도가 정적링크보다는 느리지만 메모리의 효율성이 높다. 여러 프로그램이 DLL의 함수를 공유해서 쓰게 된다. 공유메모리 공간에 따로 할당이 되며 프로그램안에 포함되는게 아니라 실행시카다 DLL파일이 필요하다.
만일, 어떤프로그램을 작성할 때 DLL함수를 가져다가 쓰고 싶다면 DLL에서 Export되어 있는 함수가 있어야한다. 그래야 프로그램에서 import하여 프로그램에서 쓸수 있다.
ex)
extern "C" __declspec(dllexport) void function();
라고 DLL에서 선언해야 하며
쓰고자 하는 프로그램에서는
extern "C" __declspec(dllimport) void function();
과 같이 선언해야 한다.
※__declspec(extended-attrivute) declarator 는 함수에 대한 정보를 제공하는 선언문이다. export, import하는 함수들은 모두 이 선언문 뒤에 나올수 있다.
프로그램이 DLL을 찾는 경로
1) 본프로그램이 있는 디렉토리
2) 프로그램을 실행한 디렉토리
3) 윈도우즈의 시스템 디렉토리
4) 윈도우즈 디렉토리
'System > Windows' 카테고리의 다른 글
PE struct (0) | 2012.08.30 |
---|---|
DLL 암시적 연결 & 명시적 연결 (0) | 2012.08.23 |
visual studio DLL complie (0) | 2012.08.21 |
Message HOOK - Window (0) | 2012.08.20 |
CreateProcess (2) | 2012.08.03 |