Programming/C / C++

DLL 만들기 불러와서 실행

사기꾼프로드 2013. 12. 20. 16:04

콘솔로 설명하겠습니다.



솔루션용 디렉토리는 만드시고 싶으시면 체크하고 아니면 놔두시면 됩니다.



다음을 눌러서 진행합니다.



추가옵션에 빈 프로젝트를 체크해주세요.



프로젝트가 만들어 진 후 새항목으로 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만 배포하면 되므로 간편해질 수 있다고 합니다.