DLL( Dynamic Linking Library)
1. DLL
① 1983년 마이크로 소프트사의 Steve Wood 가 고안
② 실행 시에 로드 되고 링크될 수 있는 윈도우즈 기본 프로그램 모듈 클래스
③ 함수와 리소스로 구성된 이진파일
④ 동적으로 실행이 가능한 라이브러리이며 코드의 공유와 리소스의 공유를 통해 메모리를 절약하는 것이 목적임
⑤ 라이브러리이므로 다른 응용 프로그램이 불러주지 않는 한 절대로 실행되지 않는다.
⑥ 확장자에는 제한이 없다. (DLL, EXE, DRV, FON)
2. 동적 링크 라이브러리와 정적 링크 라이브러리 비교
라이브러리(Library): 유용하게 쓰이는 함수들의 집합
라이브러리의 종류: 라이브러리가 프로그램과 링크되는 방법에 따라 동적 – 정적
1) 정적 링크 라이브러리
사용된 라이브러리의 함수 코드가 실행 파일 안으로 복사되어 들어간다.
전통적인 C/C++ 언어에서 사용하는 라이브러리로 확장자가 대게 LIB 이다.
실행파일에 함수의 코드가 복사되기 때문에 실행 파일이 커지는 단점이 있지만 단독으로 실행 가능한 파일이 생성된다.
정적 링크 - 실행 코드를 만들 때 링크
2) 동적 링크 라이브러리
링크 시에는 라이브러리에서 사용한 함수의 위치만이 복사된다.
함수가 실제로 실행되는 시점에 가면 그 때 DLL이 메모리로 올라오고 그 함수가 있는 위치로 실행이 넘어가게 된다.
함수의 실행코드는 DLL 파일에 위치하며, DLL은 프로세스와 분리되어 컴파일 되고 링크되고 저장되는 하나 이상의 함수를 포함한다.
동적 링크 – 실행될 때 링크
3. DLL의 장점
1) 메모리 및 디스크를 절약할 수 있다.
2) 프로그램의 크기가 작아진다.
3) 쉽게 업그레이드 할 수 있으며 프로젝트 관리가 용이하다.
4) DLL이 메모리에 로드 되어 있으면, 작은 실행 프로그램만 로드 되면 되기 때문에 프로그램의 실행속도가 빨라진다.
5) 프로그램의 모듈화가 용이하다. (커스텀 컨트롤의 작성이 용이하다.)
4. MFC와 DLL
MFC도 일종의 라이브러리이므로 프로그램 작성시 MFC 라이브러리를 정적으로 링크할지 동적으로 링크할지 설정이 가능하다.
기본이 Shared DLL로 선택되어 있음
이 경우, 프로그램이 실행될 때 다음과 같은 DLL 파일이 필요하다.
MFC**.DLL: 기본적인 MFC 클래스들
MFCO**.DLL: OLE 관련 클래스들
MFCD**.DLL: 데이터베이스관련
MFCN**.DLL: 네트워크 관련 클래스들
프로그램 작성 중간에 옵션을 변경하고자 할 때는 Project-Settings 메뉴에서 변경이 가능함
5. DLL의 종류
Visual C++로 작성 가능한 DLL의 종류 - 일반 DLL (Regular DLL) - 확장 DLL (Extension DLL)
1) Regular DLL(일반 DLL)
클래스 형태의 함수를 호출하는 것이 아니고 C 함수 형태로 호출
MFC를 사용하지 않는 다른 프로그램과도 원활하게 연결
C, 파스칼, 비주얼 베이직 등 다른 환경에서도 사용이 가능
2) Extension DLL(MFC 전용 DLL)
DLL에서 C++의 장점을 활용할 수 있도록 함
클래스나 오버로딩된 함수도 모두 라이브러리 형태로 외부의 프로그램에 제공 가능
Extenstion DLL로 만들어진 DLL은 Visual C++에서만 사용 가능
6. Exported 함수와 Import 함수
1) DLL에서 정의하는 함수
Exported Function: 다른 응용 프로그램에서 호출될 수 있는 함수
Internal Function: DLL 내부에서만 호출 될 수 있는 함수
2) Exported Function
다른 응용 프로그램에서 자기의 DLL 에 있는 함수를 호출할 수 있도록 허용하는 함수 extern __declspec(dllexport)
3) Import Function
DLL을 사용하는 클라이언트에서 어떤 DLL에 있는 어떤 함수를 사용하겠다고 선언하는 함수 extern __declspec(dllimport)
7. Regular DLL 만들기
- AppWizard를 사용하여 DLL의 골격코드를 생성
- 외부에서 호출하는 exported C 함수를 작성
- exported C 함수의 원형(Prototype)을 제공하는 헤더 파일을 작성한다.
- DEF 파일의 EXPORTS 섹션에 각 exported C 함수명을 추가한다.
- DLL을 생성한다.
DLL 만들기
1. dll 프로젝트 생성(일반 DLL)
- Regular DLL with MFC statically linked
MFC와 정적으로 링크되는 일반 DLL
DLL 안에 MFC 라이브러리에 대한 모든 정보를 가진다.
DLL의 크기가 커지는 단점이 있다.
- Regular DLL using shared MFC DLL
MFC와 동적으로 링크되는 일반 DLL로 MFC DLL 도 같이 제공해야 한다.
기존에 연결된 MFC 라이브러리로 공유하는 경우에 사용
- MFC Extension DLL MFC의 모든 클래스로부터 파생된 재사용 가능한 클래스로 구성된 DLL C++의 MFC에서만 사용
2. theApp 선언문 아래에 함수작성
extern "C" __declspec(dllexport) int AddInteger(int a, int b)
{
return a+b;
}
3. 프로젝트 빌드
4. Dll 사용을 위해 위에서 생성된 dll 파일을 윈도우 시스템 디렉토리로 복사
5. DLL을 사용할 일반 MFC응용프로그램 프로젝트 생성
6. 위에서 생성된 .lib 파일을 현재 프로젝트 폴더에 복사
7. View 클래스에 헤더파일에 DLL 함수 사용을 명시
extern "C" __declspec(dllimport) int AddInteger(int, int);
8. View 클래스의 OnDraw에 작성
CString str;
str.Format(TEXT("3+5 = %d"),AddInteger(3,5));
pDC->TextOut(100,100,str,str.GetLength());
9. [Project] - [속성] 항목을 선택 – 링커 – 입력 탭을 연다
추가 종속성에 작성 사용할 lib 파일명과 확장자를 입력
API에서 MFC의 일반 DLL 사용하기
1. API 프로젝트를 생성
2. [Project] - [속성] 항목을 선택 – 링커 – 입력 탭을 엽니다
추가 종속성에 작성 사용할 lib 파일명을 입력하고 프로젝트 폴더에 dll파일과 lib 파일을 복사해주면 함수 사용이 가능합니다.
3. 메시지 처리 함수 위에 작성
extern "C" __declspec(dllimport) int AddInteger(int, int);
4. WM_PAINT 메시지 작성
extern "C" __declspec(dllimport) int AddInteger(int, int);
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc;
TCHAR str[100];
PAINTSTRUCT ps;
switch (message)
{
case WM_PAINT:
hdc=BeginPaint(hwnd, &ps);
wsprintf(str, TEXT("3+5 = %d"),AddInteger(3,5));
TextOut(hdc,10,10,str,lstrlen(str));
EndPaint(hwnd, &ps);
return 0;
case WM_DESTROY:
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
Visual Basic에서 사용
1. Visual Basic 프로젝트 생성
2. 나타나는 폼에 레이블 1개와 버튼 1개 추가
3. 버튼을 더블 클릭해서 코드 작성
Dim Result As Integer
Result = AddInteger(3, 4)
Label1.Text = "3+4=" + Str(Result)
4. 모듈을 추가해서 다음 문장 작성[프로젝트] – [모듈 추가]
Declare Function AddInteger Lib “Dll이름.dll” (ByVal A As Integer, BuVal B As Integer) As Integer
로그인하는 DLL 만들기(Login)
'C & C++ > C & C++' 카테고리의 다른 글
[MFC] Thread (0) | 2011.04.25 |
---|---|
[MFC] Sheel 프로그래밍 (0) | 2011.04.25 |
[MFC] 파일 입출력 (0) | 2011.04.25 |
[MFC] 대화 상자 (0) | 2011.04.25 |
[MFC] Message 처리 (0) | 2011.04.25 |
댓글