DLL 이란
- 동적 연결 라이브러리로 여러 함수의 공유 라이브러리로 사용되는 실행 파일
- 동적 링크를 사용해서 프로세스에서 실행 코드에 포함되지 않은 함수 호출
- 함수 실행 코드는 DLL에 있으며, DLL을 사용하는 프로세스와 별도로 컴파일 링크 및 저장되는 하나 이상의 함수가 포함
- DLL 사용해서 데이터와 리소스를 쉽게 공유
- 여러 개의 응용 프로그램에 있는 하나의 DLL 복사본 내용을 동시에 액세스 할 수 있음
정적 링크
-동적 링크는 DLL 함수의 실행 코드를 찾기 위해 런타임에 필요한 정보만 실행 모듈에 포함(.DLL 또는 EXE)
-정적 링크는 링커가 정적 연결 라이브러리에 참조되는 모든 함수를 가져와 코드화 함께 실행 파일에 포함
동적 링크 장점
- 메모리 절약, 스와핑 감소, 디스크 공간 절약, 용이한 업그레이드, 출시 후 지원 제공, MFC 라이브러리 클래스를 확장할 수 있는 메커니즘 제공, 여러 가지 언어 형식 프로그램 지원, 용이한 국가별 버전 생성
응용 프로그램과 DLL 차이점
-응용 프로그램과 DLL 모두 실행 가능한 프로그램 모듈
-응용 프로그램은 시스템에서 인스턴스가 동시에 여러개 실행 될 수 있음
-DLL의 경우 하나의 인스턴스만 실행
-응용 프로그램에는 스택, 전역 메모리, 파일, 핸들 및 메시지 큐 등이 포함 될 수 있지만 DLL은 불가
Windows DLL 생성
visual studio를 이용해서 DLL 만들고 DLL을 사용하는 프로젝트를 생성
새로운 프로젝트 생성 Win32 콘솔 응용 프로그램 템플릿 선택
Win32 응용프로그램 종류 DLL선택
사칙 연산을 하는 함수 코드 추가
extern "C" __declspec (dllexport )
double Add(double a , double b )
{
return a + b;
}
extern "C" __declspec (dllexport )
double Sub(double a , double b )
{
return a - b;
}
extern "C" __declspec (dllexport )
double Mult(double a , double b )
{
return a* b;
}
extern "C" __declspec (dllexport )
double Div(double a , double b )
{
return a / b;
}
extern "C" __declspec(dllexport) 라는 키워드가 붙음.
함수 선언과 정의시 키워드를 붙이지 않을 경우 DLL사용 시 해당 함수를 호출 할수 없음.
빌드가 되면 생성되 DLL 및 lib 파일 확인 가능
DLL 사용하기
Win32 Console Application 생성
// DLLTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
//DLL 파일 포함
//컴파일된 라이브러리의 lib 파일이 컴파일 시 필요
#pragma comment (lib , "MakeDLL" )
//dllimport 키워드를 사용해 함수가 dll에 사용되는 함수라는 것을 명시
//dllimport 필수 요소는 아님. 명시해줄 경우 컴파일 시 어셈블리 코드가 더 효율적으로 생성됨.
(테스트 해보면 명시 안 해주면 못찾음;;.)
extern "C" __declspec (dllimport ) double Sub(double a, double b);
int main()
{
double result = 0;
result = Sub(100.0, 10.0);
printf( "%lf\n", result);
return 0;
}
DLL 사용하는 방법
#pragmacomment (lib , "MakeDLL" )lib 파일음 포함
extern "C" __declspec (dllimport ) double Sub(double a, double b);
함수 사용 result = Sub(100.0, 10.0);
사용하는 프로젝트 폴더에 생성된 dll, lib 파일
실행
dllimport 안된 함수를 호출하니깐 못찾는다.. 구글링 해보니 define을 이용하는 방법이 있었다.
다른 방법은 extern "C"를 이용해서 명시하는 방법도 있었다.
extern "C"
{
double Sub( double a, double b);
double Add( double a, double b);
}
참고 사이트
http://exportidea.blogspot.kr/2013/08/windows-dll.html
http://copynull.tistory.com/25