DLL 이란

- 동적 연결 라이브러리로 여러 함수의 공유 라이브러리로 사용되는 실행 파일

- 동적 링크를 사용해서 프로세스에서 실행 코드에 포함되지 않은 함수 호출

- 함수 실행 코드는 DLL에 있으며, DLL을 사용하는 프로세스와 별도로 컴파일 링크 및 저장되는 하나 이상의 함수가 포함

- DLL 사용해서 데이터와 리소스를 쉽게 공유

- 여러 개의 응용 프로그램에 있는 하나의 DLL 복사본 내용을 동시에 액세스 할 수 있음

 

정적 링크

-동적 링크는 DLL 함수의 실행 코드를 찾기 위해 런타임에 필요한 정보만 실행 모듈에 포함(.DLL 또는 EXE)

-정적 링크는 링커가 정적 연결 라이브러리에 참조되는 모든 함수를 가져와 코드화 함께 실행 파일에 포함

 

동적 링크 장점

- 메모리 절약, 스와핑 감소, 디스크 공간 절약, 용이한 업그레이드, 출시 후 지원 제공, MFC 라이브러리 클래스를 확장할 수 있는 메커니즘 제공, 여러 가지 언어 형식 프로그램 지원, 용이한 국가별 버전 생성

 

응용 프로그램과 DLL 차이점

-응용 프로그램과 DLL 모두 실행 가능한 프로그램 모듈

-응용 프로그램은 시스템에서 인스턴스가 동시에 여러개 실행 될 수 있음

-DLL의 경우 하나의 인스턴스만 실행

-응용 프로그램에는 스택, 전역 메모리, 파일, 핸들 및 메시지 큐 등이 포함 될 수 있지만 DLL은 불가

 

Windows DLL 생성

 

visual studio를 이용해서 DLL 만들고 DLL을 사용하는 프로젝트를 생성

 

새로운 프로젝트 생성 Win32 콘솔 응용 프로그램 템플릿 선택

 

 - 비주얼 스튜디오 2019 다운로드

 

 

 

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://blog.secmem.org/597

http://exportidea.blogspot.kr/2013/08/windows-dll.html

http://copynull.tistory.com/25