DDL (Dynamic Linked Library)
- 동적 연결 라이브러리
- 프로그램 내부에 라이브러리가 있는 것이 아니라 따로 독립적으로 실행 가능한 파일
- 필요시에 로드할 수 있는 라이브러리
- 장점
- 실행 파일의 크기를 줄일 수 있다.
- 메모리를 효율적으로 사용할 수 있다.
- 재사용이 가능하다
- 커다란프로젝트를 여러 개의 작은 프로젝트로 나누어 작성할 수 있다.
- 새로운 함수나 기능 추가를 다시 링크하지 않고 처리할 수 있다.
- 단점
- 실행파일이 작아지는 대신 배포해야 할 파일의 수가 증가한다.
- 프로젝트의 복잡성을 증가시킬 수 있다.
- 버전 관리에 더욱 신경을 써야한다.
Implicit 링크
- 프로그램이 시작되면서 DLL을 바로 로드하는 방법
- 필요한 파일
- 실질적으로 프로그램이 실행될 때 로드되는 DLL 파일 (*.DLL)
- 컴파일할 때 설정해주는 함수 명이 들어 있는 헤더 파일 (*.h)
- 링크할 때 메인 프로그램에 빈 함수를 설정하는 LIB 파일 (*.LIB)
- 메인 프로그램을 컴파일하고 링크할 때 DLL 안에 들어 있는 함수들은
어느 것과와도 링크되어 있지 않아 실행 파일을 만들 때 에러 발생
- LIB 파일에서 함수를 가상 함수로 만들어 그것을 0으로 설정해주는
함수가 있어야지 링크 시 에러가 나지 않는다.
- 사용 방법
- 링크 옵션에서 사용할 DLL 파일의 임포트 라이브러리(*.DLL) 추가
- 사용할 DLL파일의 임포트 라이버리를 프로젝트 디렉터리에 복사
- 헤어 파일을 포함
Explicit 링크
- Implicit 링크 처럼 세가지 파일 필요없이 단순하게 DLL을 이용하여 로드
- 3가지 함수를사용
- LoadLibrary() 함수 : DLL을 로드할 때 사용하는 함수
- GetProcAddress() 함수 : 함수의 포인트를 찾을 때 사용하는 함수
- FreeLibrary() 함수 : 라이브러리를 해제할 때 사용하는 함수
- 사용 방법
- 먼저 사용하고자 하는 함수에 대한 타입을 선언
- Typedef int(*CalenderFunc)(int num);
- LoadLibrary() 함수를 이용하여 프로그램 내에서 사용하고자 하는 DLL을 메모리에 로드한다.
- HINSTANCE hDLL
hDLL = LoadLibrary(”Execise.dll”) // 로드할 파일명
- DLL에서 사용할 함수의 메모리 번지를 알아오고 포인터로 받는다.
이때 인자와 반환형이 일치되어야 한다.
- CalenderFunc IpCalenderFunc;
IpCalenderFunc = (CalenderFunc)GetProAddress(hDll, “Calender”);
// DLL 인스턴스 핸들, DLL 안에 존재하는 함수 이름
- 원하는 함수를 호출한 후 더 이상 필요하지 않을 경우 FreeLibrary()
DLL의 종류
- 정규 DLL :
- Win32 프로그램 환경으로 설정
- MFC를 사용하지 않는 프로그램과도 연결 할 수 있는 범용적 DLL
- 표준 C 형식의 인터페이스 사용
- 정규 DLL 작성법
- 현재 함수가 DLL 외부에서 사용할 수 있도록 함수를 선언
- extern “C” _desclspec(dllexport) void Calender()
- 함수 내용 코딩시 _desclspec(dllexport) 를 함수 명 앞에 쓰고 구현
- 컴파일 하면 DLL , LIB 파일이 생성된다.
- 정규 DLL 사용법
- extern “C” _desclspec(dllimport) void Calender()
- DLL 함수를 호출해 사용하면 된다.