API

DLL 테스트할 샘플 코드 만들기 - 프로젝트 병합 살펴볼 것

디버그정 2008. 8. 29. 04:20

DLL 테스트할 샘플 코드 만들기

Code Story/Referance 2008/04/03 00:02

안녕하세요 ^^* 딸기우유 입니다.

이 포스트는 프로그래밍에 대해 직접 올리는 첫 포스트 입니다.

저도 포스트를 쓰며 공부했던 내용을 정리하고 누군가에게는 답답함을 시원하게 풀어주는 좋은 자료가 되기를 바랍니다.

그럼 시작해 보겠습니다.

Visual C++ 6.0을 이용해 간단하게 DLL을 테스트하는 샘플 프로젝트를 만들어 보겠습니다.

DLL(Dynamic Link Library)는 동적 연결 라이브러리 입니다.

동적 연결이란 것은 프로그램 내부에 라이브러리가 있는게 아니라 따로 외부에 있고, 필요할때 라이브러리를 로드 시켜서 사용하는 것입니다.

구조는 아래와 같이 진행 하겠습니다.

DLL 프로젝트와 DLL을 테스트할 Dialog 프로젝트를 만들고, 두 프로젝트를 연결하여 사용하는 방법과 컴파일일 하는 방법에 대해 알아보겠습니다.


1) 먼저 Visual Studio 에서 File -> New 를 선택하고 Projects 탭에 MFC AppWizard(dll)을 선택하고 끝까지 OK를 누릅니다.



2) 다음은 테스트할 Dialog를 만들어보겠습니다. File -> New 에서 이번엔 MFC AppWizard(exe)를 선택합니다.



3) 다음 step에서 Dialog based 를 선택하고 Finish를 누릅니다.



4) Dialog 프로젝트를 마치면 바로 리소스를 편집하는 곳으로 이동하게 되는데, 여기서 버튼하나를 만든뒤 더블 클릭하면 버튼에 이벤트 함수를 등록할 수 있습니다. OK를 누릅니다.



5) 다음은 dll이 많거나 연결해야할 클래스들이 많을때 아래와 같이 프로젝트 환경을 만들어 주면 편합니다. (편한 정도가 아니라 이렇게 해야만 하겠죠? ^^;)

New -> File 에서 Workspaces 탭에서 Blank Workspace를 선택합니다.

6) 이렇게 생성된 프로젝트에서 마우스 오른쪽 버튼을 클릭하고 Insert Project into Workspace 클릭하여 앞에서 만들었던 두 프로젝트(SmilkDLL.dsp, DLLTest.dsp 파일)를 추가합니다.

7) 이렇게 추가된 환경에서 굵은 글씨로 표시된 프로젝트가 활성화 되어 있는 프로젝트 입니다. 활성화는 아래 그림과 같이 Set as Active Project 를 선택하면 됩니다. 프로젝트를 활성화 하면 해당 프로젝트를 디버깅 할 수 있고, 컴파일 할 수 있고, 해당프로젝트에서 "찾기" 기능을 이용할 수 있습니다.  

8) 아래는 프로젝트 생성하는 폴더 구조입니다. 컴파일한 결과를 담아둘 Output 이라는 폴더를 만듭니다.


9) Output 설정은 Project -> Settings 에서 Link 탭을 선택해 Output 폴더의 경로를 아래와 같이 적어주면 됩니다. DLLTest 와 SmilkDLL 프로젝트를 각각 선택하여 경로를 적어 주어야 합니다.


10) 환경 설정을 마쳤으니 코드를 작성해 보겠습니다.
dll에서 함수 하나를 만들고, 그 함수를 테스트 Diag에서 테스트 할 수 있게 해보겠습니다.

SmilkDLL.cpp 의 끝부분에 글로벌 함수로 두 int형 인자를 받아 더해서 리턴해 주는 함수를 만듭니다.

extern "C" __declspec(dllexport) int test_function(int a, int b) {
int result = a + b;
return result;
}

11) 다음으로 Test Dialog 에서 버튼 이벤트를 넣었던 함수 OnButton1 로 가서 아래와 같이 작성합니다.

void CDLLTestDlg::OnButton1()
{
/**
Explicit 링킹은 LoadLibrary 함수를 통해 라이브러리를 로드합니다.
*/
HINSTANCE hDLL = NULL; 
hDLL = LoadLibrary("SmilkDLL.dll"); // 인스턴스 핸들. 이 인스턴스 핸들을 이용하여 필요한 함수 포인터 찾습니다.
if (hDLL == NULL)
return;
typedef int (* testfunction)(int, int); // dll 에 있는 함수 정의.
testfunction funcObj = NULL;
/**
GetProcAddress 함수 원형
FARPROC GetProcAddress (
  HMODULE hModule, // dll 인스턴스
  LPCSTR lpProcName // 함수이름
)
*/
funcObj = (testfunction)GetProcAddress(hDLL, "test_function");
if (funcObj == NULL)
return;
int val = (funcObj)(1, 2);
CString res;
res.Format("%d", val); // 메세지 박스에 띄우기 위해 출력형식을 써줍니다.
AfxMessageBox(res);
}


12) 이제 프로젝트 각각을 컴파일(F7)을 하고 실행시킵니다. 아래와 같이 버튼을 누르면 함수에서 리턴된 값이 출력됩니다.



top