DLL 만들기 불러와서 실행
콘솔로 설명하겠습니다.
솔루션용 디렉토리는 만드시고 싶으시면 체크하고 아니면 놔두시면 됩니다.
다음을 눌러서 진행합니다.
추가옵션에 빈 프로젝트를 체크해주세요.
프로젝트가 만들어 진 후 새항목으로 CPP파일 main이라는 것을 생성하겠습니다.
생성된 main.cpp에 아래와 같은 소스코드를 넣어줍니다.
#include <stdio.h> #include <conio.h> #include <windows.h> typedef void (*Message)(void); // 함수포인터 연결 void main() { //dll 불러옴 HMODULE hDLL = LoadLibrary( "SimpleDLL.dll\0"); // dll 말고도 exe 내부에 있는 함수도 불러올 수 있음 //GetProcAddress dll에 있는 명령어를 가져와 함수 포인터에 연결시켜줌 //Message 형식으로 캐스팅 Message pMsg = (Message)GetProcAddress( hDLL, "MessageHello2\0"); //실행 pMsg(); //dll 해제 FreeLibrary( hDLL ); getch(); }
이제 DLL을 만들어주기 위해 새 프로젝트를 추가 합니다.
위 처음 프로젝트 만들때와 동일하게 진행하되 밑의 스크린샷과 같은 부분에서만 다르게 합니다.
응용프로그램 종류를 DLL으로 설정 후 추가 옵션에 내보내기 기호를 체크해 주세요.
생성하면 프로젝트 내에 여러 파일들이 있을겁니다.
stdafx.cpp
stdafx.h
이 두개 파일과 프로젝트 이름과 같은 이름의 CPP 파일이 있는데
우선은 dllmain 이라는 파일이 있을겁니다. 이 파일내용에
BOOL APIENTRY DllMain 부분을 복사해서 프로젝트 이름과 같은 이름의 cpp 파일에 붙여넣기 합니다.
그 외 내용은 다 삭제되도 됩니다.
그럼 아래와 같은 내용을 추가로 써줍니다.
#include "stdafx.h" #include <stdio.h> // EXPORTS 정의 유무에 따른 extern "C" __declspec // dllexport 를 편하게 하기위해 정의 #ifdef SIMPLEDLL_EXPORTS // EXPORTS 가 정의되어있다면 #define SIMPLEDLL_API extern "C" __declspec(dllexport) #else // 아니면 #define SIMPLEDLL_API extern "C" __declspec(dllimport) #endif SIMPLEDLL_API void MessageHello ( void ) { printf("Hello! \n"); } SIMPLEDLL_API void MessageHello2 ( void ) { printf("Hello! \n"); printf("Hello! \n"); } // dllmain에서 복사해온 부분 BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } //
빌드를 하면 Debuge 폴더에 DLL파일이 생성되어있을겁니다.
또한 실행 화면에서는 main.cpp에선 없던 printf문이 dll파일을 불러와 출력될겁니다.
실행 화면
DLL은 LIB와는 다르게 리소스파일을 포함할 수 있고. 다른 DLL도 가져올 수 있다고 합니다.
또한 어떠한 리소스가 문제가 있어 패치를 해야할 상황일 때
EXE파일에 리소스가 다 포함되어져 있다면 용량이 큰 EXE파일을 배포해야 하지만
DLL에 포함되어있다면 DLL만 배포하면 되므로 간편해질 수 있다고 합니다.