본문 바로가기

MFC

[MFC] 확장 DLL 만들기(스크랩)

출처 : http://psh85a.tistory.com/entry/MFC-Dll-%EB%B0%B0%ED%8F%AC-%EB%B0%8F-%EC%82%AC%EC%9A%A9


MFC DLL에서 프로젝트를 생성한다.




프로젝트 설정에서 DLL형식을  MFC 확장 DLL로 바꾼다




배포할 해더파일을 추가한다



Dllmain.cpp 에 추가된 해더파일을 인쿠르드 시키고, Dll을 만들 함수를 작성한다.

// dllmain.cpp : DLL의 초기화 루틴을 정의합니다.
//

#include "stdafx.h"
#include <afxwin.h>
#include <afxdllx.h>

#define DLLDEMO_EXPORT
#include "DllDemo.h"


#ifdef _DEBUG
#define new DEBUG_NEW
#endif

static AFX_EXTENSION_MODULE DllDemoDLL = { NULL, NULL };

extern "C" int APIENTRY
.
.
.
.
//DLL을 만들기 위한 함수
int WINAPI add(int a, int b)
{
       return a+b;
}



그리고 위에 만들었던 DllDemo.h 파일에 다음과 같이 함수 선언과 DLL을 사용하기 위한 코드를 작성한다.

(함수가 하나인 경우)
//DLLDEMO_EXPORT define이 있으면 1 없으면 2
#ifdef DLLDEMO_EXPORT
extern "C" __declspec(dllexport)//1
#else
extern "C" __declspec(dllimport)//2
#endif

int WINAPI add(int a, int b);


//DLLDEMO_EXPORT 없으면 실행 있으면 사라짐
#ifndef DLLDEMO_EXPORT
#pragma comment(lib, "Dll_Demo")
#endif


(함수가 두개인 경우)
//DLLDEMO_EXPORT 없으면 실행 있으면 사라짐
#ifndef DLLDEMO_EXPORT
#pragma comment(lib, "DllDemo")
#endif

//DLLDEMO_EXPORT define이 있으면 1 없으면 2
#ifdef DLLDEMO_EXPORT
#define A extern "C" __declspec(dllexport)//1
#else
#define A extern "C" __declspec(dllimport)//2
#endif

A int WINAPI add(int a, int b);
A BOOL WINAPI GetModulePath(CString& strPath);

//DLLDEMO_EXPORT 없으면 실행 있으면 사라짐
#ifndef DLLDEMO_EXPORT
#pragma comment(lib, "DllDemo")
#endif



빌드 후 Debug폴더를 확인해보면 DLL_Demo.dll과 DLL_Demo.lib 파일이 생성된 것을 볼 수 있다.
위 두 파일과 DllDemo.h 해더 파일  3개의 파일을 배포해서 사용하면 DLL함수를 사용할 수 있다. 그럼, 저 파일을 사용할 프로젝트를 생성해보자.


기존 DLL_Demo 프로젝트에서 파일 -> 새로만들기 ->  프로젝트 를 다음과 같이 만들자. (대화상자 기반)





 만들었던 .lib파일과 .dll 그리고 .h파일을 새로 만든 프로젝트 폴더에 복사해서 넣는다.



.h파일이 추가 되었으므로 DLLTest에 해더를 복사 시킨 해더를 추가시키고 다이얼로그에 버튼 이벤트를 만들고 다음과 같이 코드를 작성하자.

void CDLLTestDlg::OnBnClickedButton1()
{
      CString strTemp = _T("");
      strTemp.Format(_T("Add 1+2 = %d"), add(1,2)); //DLL에 있는 add함수
      AfxMessageBox(strTemp);
}

.h를 추가 시켰으므로 Dlg.cpp에 추가된 해더를 include시키는 것을 잊지 말자




실행 결과 DLL로 만든 함수가 잘 되는 것을 볼 수 있다. ( .dll, .lib, .h파일을 배포한 후에 사용가능)