일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 별찍기
- MFC
- ListBox
- 김성엽
- linux
- 마이크로소프트
- SSG
- 미가공
- visual
- C언어
- MFC 예제
- 핵심 요약
- 포트폴리오
- 정보처리기사
- Tipsware
- 정처기 독학
- 충무창업큐브
- 도움말
- 유료강좌
- mfc 실습
- win32
- MyTread
- do it c
- C
- mysql
- MyThread
- tips강좌
- 실습
- C++
- Time
- Today
- Total
History
[Visual] DLL(동적 연결 라이브러리) 만들기 본문
1. LIB과 DLL
LIB(Library,*lib) 파일은 C언어 소스 파일을 컴파일해서 만든 목적 파일(*. obj)을 효율적으로 재구성해 놓은 파일이다.
따라서 라이브러리는 특정 소스를 대체하는 개념으로 사용되고 이미 컴파일 된 상태이기 때문에 추가로 컴파일되지는 않는다.
그러나 라이브러리는 실행 파일에 직접 포함되는 개념이기 때문에 라이브러리에 문제가 있어 라이브러리 파일을 다시 만들었다면 이 라이브러리를 사용하는 모든 실행 파일은 새 라이브러리 파일을 사용해서 다시 빌드해야 하는 불편함이 있다.
그래서 Windows 운영체제에서는 이런 불편함을 줄이기 위해서 DLL(Danamic Linking Library) 이라는 기술을 제공한다.
DLL도 LIB처럼 실행파일에 종속된 개념이지만 DLL은 빌드 시에 실행 파일에 포함되지 않고 프로그램이 실행될 때 해당 DLL 파일을 포함해서 실행하게 된다. 즉 LIB 파일은 빌드시에 실행 파일에 포함되지만 DLL 파일은 프로그램이 실행될 때 실행파일에 포함되는 개념이다.
따라서 DLL은 문제가 있어서 파일이 수정되더라도 해당 DLL 파일을 사용하는 실행 파일은 수정하지 않아도 된다는 장점이 있다.
2. DLL 만들기
아래 그림처럼 Windows 데스크톱 마법사를 선택한다.
다음으로 넘어가면 프로젝트 이름을 적는 란이 나오는데 원하는 이름을 적고 다음으로 넘어가자
다음으로 넘어가면 아래 그림처럼 어플리케이션 종류를 고르는 콤보박스가 나온다. 이때 동적 연결 라이브러리를 선택한다.
추가 옵션에서는 미리 컴파일된 헤더에 체크를 하고 프로젝트를 생성하자.
그런 후 솔루션 탐색기에서 새로운 CPP를 추가할 것이다. CPP 이름은 자신이 원하는 이름으로 넣자.
이제 자신이 원하는 함수를 추가하는 작업을 진행하자. 난 간단하게 변수를 더하는 함수를 넣어보겠다. 소스는 아래와 같다.
#include"pch.h"
__declspec(dllexport) int Sum(int a, int b)
{
return a + b;
}
__declspec(dllexport)는 DLL을 사용하는 프로그램에서 Sum을 사용하려면 함수 선언부에 추가해줘야 한다.
이제 빌드를 해보면 아래와 같이 dll과 lib가 만들어져 있다.
이제 WINAPI에서 간단하게 테스트를 해보겠다. 우선 아래 코드를 선언해 주고 마우스 왼쪽 버튼이 윈도우에 눌리면 Sum함수가 출력되도록 만들었다.
#pragma comment (lib,"ProjectDLL.lib")
//ProjectDLL.dll을 사용할 수 있도록 ProjectDLL.dll과 함께 만들어진 ProjectDLL.lib 파일 추가
int Sum(int, int);
//ProjectDLL.dll에 포함되어있는 Sum 함수의 원형을 적는다.
결과는 아래와 같다.
위와 같은 방법으로 진행하면 dll로만 사용하는 것이 아닌 lib를 통해 dll에 접근하는 방식이기 때문에 이번에는 lib 파일을 사용하지 않고 dll 파일에 포함된 함수를 사용해 보도록 한다.
lib 파일을 사용하지 않으려면 dll 파일에 있는 함수의 이름으로 접근해야한다. 그러나 C++ 컴파일러는 함수를 컴파일할 때 함수의 이름을 임의로 수정하기 때문에 Sum 함수의 이름이 그대로 유지되게 하려면 Sum 함수는 C언어 방식으로 컴파일해야 한다. 어떻게 하는지는 아래 코드를 보자.
#include"pch.h"
//extern "C"를 쓰는 이유는 컴파일을 할 때 C방식으로 컴파일을 하라는 뜻이다.
extern "C" __declspec(dllexport) int Sum(int a, int b)
{
return a + b;
}
이렇게 빌드한 dll파일은 다시 WINAPI 프로젝트의 경로에 복사해놓는다.
이렇게 lib 파일 없이 dll을 사용하게 되면 프로그램이 실행될 때 dll 파일과 바로 연결되지 않는다 그래서 프로그램이 실행될 때 dll 파일이 없어도 오류가 발생되지 않는다.
이제 lib 없이 바로 dll을 적용하는 코드를 소개하겠다.
HMODULE h_sum_dll = LoadLibrary(L"ProjectDLL.dll"); //dll과 이 프로그램과 연결한다.
FreeLibrary(h_sum_dll); //연결한 dll을 연결 해제한다.
이제 연결하고 해제하는 작업은 끝냈으니 dll에서 필자가 원하는 함수를 찾는 코드를 작성하겠다.
int (*p_sum)(int, int);
//Sum의 주소를 저장할 수 있는 함수 포인터 p_sum 선언
p_sum = (int(*)(int, int))GetProcAddress(h_sum_dll, "Sum");
//GetProcAddress를 사용해서 연결된 dll 파일에서 Sum의 주소를 p_sum에 대입
GetProcAddress함수는 찾고 싶은 함수의 이름을 문자열로 적으면 해당 함수의 주소를 반환한다. 그래서 이 주소를 사용하기 위해서는 함수포인터를 사용해야 한다.
이렇게 코드를 구성하면 프로그램을 실행하면서 dll 파일과 바로 연결될 필요도 없고 자신이 원하는 시점에 dll을 연결하고 해제할 수 있다.
아래는 첫 번째와 동일한 실행 결과를 보여주는 이미지이다.
'Visual Studio > Visual' 카테고리의 다른 글
[Visual] x64비트 프로그래밍과 x86비트 프로그래밍 차이점 (0) | 2024.11.15 |
---|---|
[Visual] MFC 프로젝트 속성 -> 구성 속성 -> 일반 속성 (0) | 2023.11.21 |
MFC 응용 프로그램 배포하는 방법 (0) | 2022.11.17 |
프로젝트 압축할 때 필요없는 파일 지워서 용량 줄이기 (0) | 2022.07.14 |
Visual Studio 원격 Window 디버그 (0) | 2022.07.08 |