^.^
by 저녁참새
메뉴릿
카테고리
C++ 클래스로 dll 만들기

dll 그리고 class

현재 개인 프로젝트를 진행하면서,

dll을 만들어야 할 필요가 생겼는데,

dll의 내부는 전부다 C++로 구현을 했습니다.


그러다 보니, dll의 헤더 파일에서 C++ class의 포인터를 넘겨주는 구조로 만들거나,

아니면 class의 인터페이스를 전부 C 스타일로 래핑(Wrapping)을 해야하는 상황이 벌어졌습니다. 


Windows Api 정복 2권 44장에 보면 C++ 클래스를 dllexport하는 방법은 써 있는데,

이것을 어떻게 Wrapping하는지는 안 써있습니다.

(Wrapping하는 것이 그냥 class를 쓰는 것보다는 좋다고 나와있기는 합니다.... 예시도 있었으면 더 좋았을 것을....)

그래서 Google 검색 결과를 통해 배운 것을 여기에 정리하고자 합니다.

Class 인터페이스를 C 스타일로 Wrapping하기

위 링크는 제가 이 작업을 하는데 가장 큰 도움을 준 글입니다.

지금 아래에 적는 방법은 위 글의 내용을 약간 변형한 것입니다.

솔루션 구성

우리가 실습할 솔루션은 두 개의 프로젝트로 구성이 되어 있습니다.

1. Money : 그냥 간단히 작동하는가 출력을 위해서 console application으로 만들었습니다.

2. MoneyDLL : Money라는 클래스로 구현된 DLL입니다.

 

솔루션 구성 보기

소스코드 보기

MoneyDLL

/* money.h */

#pragma once

class Money
{
public:
  int test();
  int test2();
};

/* money.cpp */
#include "Money.h"

int Money::test()
{
  return 0;
}

int Money::test2()
{
  return 1;
}

설명이 필요 없을만큼 참으로 간단한 코드입니다.


과연 class로 dll을 구현했을 경우 어떤 일이 벌어질 것인가를 알기 위해서 적은 코드입니다.



/* MoneyHeader.h */
#ifdef DLLEXPORT
#define MYDLLTYPE __declspec(dllexport)
#else
#define MYDLLTYPE __declspec(dllimport)
#endif

#include "Money.h"

typedef void* PMoney; // ⓐ

// ⓑ
extern "C" MYDLLTYPE PMoney MoneyConstruct();
extern "C" MYDLLTYPE int MoneyTest(PMoney money);
extern "C" MYDLLTYPE int MoneyTest2(PMoney money);
extern "C" MYDLLTYPE void MoneyDestruct(PMoney money);


여기서는 두 군데에 집중을 해 보도록 합시다.


ⓐ 부분:

여기에서는 우리가 사용할 자료형을 정의하는 것입니다.

Money에 대한 포인터이므로 PMoney라고 정의하였습니다.

void*을 계속 사용하는 것보다는 아무래도 가독성면에서 이득이 클 것이라고 생각이 됩니다.


ⓑ 함수들 :

인터페이스들을 모아 놓았습니다.

생성자와 소멸자는 MoneyConstruct()와 MoneyDestruct(PMoney)로 만들어졌습니다.

생성자 이외의 함수에서는 모두 PMoney를 받고 있습니다.



/* MoneyImpl.cpp */
#define DLLEXPORT
#include "MoneyHeader.h"

extern "C" MYDLLTYPE PMoney MoneyConstruct()
{
  Money* money = new Money();
  return (PMoney)money;
}

extern "C" MYDLLTYPE int MoneyTest(PMoney money)
{
  Money* m = (Money*)money;
  return m->test();
}

extern "C" MYDLLTYPE int MoneyTest2(PMoney money)
{
  Money* m = (Money*)money;
  return m->test2();
}

extern "C" MYDLLTYPE void MoneyDestruct(PMoney money)
{
  Money* m = (Money*)money;
  delete m;
}

위의 MoneyHeader.h에 선언된 함수들에 대한 정의입니다.

보시면 아시겠지만,

그냥 연결해주는 것 외에는 딱히 하는 일이 없습니다.



Money

/* main.cpp */
#include <stdio.h>
#include "../MoneyDLL/MoneyHeader.h"

#pragma comment(lib, "MoneyDLL")

void main()
{
  PMoney m = MoneyConstruct();
  printf("%d %d", MoneyTest(m), MoneyTest2(m));
  MoneyDestruct(m);
}

정상 작동하는가 실험을 해 보았습니다.

0, 1을 출력합니다.

정확히 잘 동작합니다.

바보같은 질문이란 없습니다.

Q: 돈과 관련이 전혀 없는데, 왜 클래스 이름이 Money인가요?

A: 요즘 UnitTest++이라는 단위 검사 Framework를 공부하다 보니,

TDD(테스트 주도 개발)에서 예제로 삼는 Money 예제를 자주 보게 되었습니다.

거기서 Money 클래스를 자주 쓰길래 Money라고 이름을 지어 봤습니다.

딱히 다른 이유가 있었던 것은 아닙니다.

이 글과 관련있는 글을 자동검색한 결과입니다 [?]

by 저녁참새 | 2010/02/25 21:19 | 트랙백 | 덧글(0)
트랙백 주소 : http://tain68.egloos.com/tb/10421967
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >


최근 등록된 덧글
debt consolidation on..
by debt consolidation o at 12/25
cash advance pa..
by Cash Advance at 12/18
안녕
by 등불 at 09/16
1vGood idea.6o I co..
by 乙麟壯 at 08/24
실장님. 안녕하세요. (..
by 가을을 기다리며 at 08/19
당뇨를 처음 진단 받으신..
by jsleecc at 08/12
방문 감사 드립니다... ..
by Blue Diary at 07/02
대단해요. 물 베는 모습...
by 옥주태생 at 07/02
재미잇게 잘읽엇어요....
by gold steel at 07/01
저녁 참새는 노래를 잘 ..
by 등불 at 06/24
최근 등록된 트랙백
메모장
이전블로그
이글루링크
이글루 파인더
rss

skin by 이글루스