|
아래 사항을 이미 알고 계실지도 모르겠으나 확인 겸 적어봅니다.
DLL 내에 정의된 클래스를 외부에서 사용할 수 있게 하려면 해당 클래스를 통째로 export 하거나 각 멤버 별로 export 합니다.
즉, 아래의 두 가 지중 하나로 합니다.
//mydll.h
class __declspec(dllexport) TClassInDll
{
멤버_1;
멤버_2;
멤버_3;
};
class TClassInDll
{
__declspec(dllexport) 멤버_1;
멤버_2;
__declspec(dllexport) 멤버_3;
};
그리고 이 클래스를 사용하는 쪽에서는 보통 load time linking을 사용하는 것이 편리합니다.
(C++Builder 도움말에서는 'statically linking with a .DLL'이라 칭하는군요)
그러기 위해서는 해당 프로젝트에 dll의 임포트 라이브러리를 포함시킵니다.
물론 mydll.h도 #include 해주어야 합니다.
임포트 라이브러리는 이미 생성되어 있는 dll에 대해 implib.exe를 실행하거나
dll을 만들 때 Project->Options->Linker 탭의 'Generate import library'를 선택하면 만들 수 있습니다.
한편 mydll.h는 dll과 이를 사용하는 프로그램 양쪽 모두에서 #include하게 되는데
dll에서는 __declspec(dllexport)가 되어야 하고 dll을 사용하는 쪽에서는 __declspec(dllimport)가 되어야 합니다.
따라서 위의 mydll.h를 아래와 같이 만든 다음 dll의 프로젝트 옵션에서 _CREATING_DLL_을 정의해주면 됩니다.
#if defined(_CREATING_DLL_)
# define EXPORT_OR_IMPORT __declspec(dllexport)
#else
# define EXPORT_OR_IMPORT __declspec(dllimport)
#endif
class EXPORT_OR_IMPORT TClassInDll
{
멤버_1;
멤버_2;
멤버_3;
};
class TClassInDll
{
EXPORT_OR_IMPORT 멤버_1;
멤버_2;
EXPORT_OR_IMPORT 멤버_3;
};
위와 같이 하면, mydll.dll을 사용하는 쪽에서
TClassInDll의 인스턴스를 생성할 수도 있고 이를 상속해서 다른 클래스를 만들 수도 있습니다.
이렇게 했는데도 build 또는 실행 시 에러가 발생한다면 다른 문제가 있는 것입니다.
- calling convention 관련
- name mangling 관련
- 기타
C++Builder가 제공하는 클래스들도 결국은 DLL 개념입니다.
'runtime package'에 대해 알아보는 것도 도움이 되실 것입니다.
정보지기 님이 쓰신 글 :
: 안녕하세요. 잘 모르는게 있어 질문을 하나 올립니다.
:
: 많이 아시는 분께서 제 원하는 답을 해 주시면 감사하겠습니다. 꾸벅....
:
: 궁금한 것이 뭐냐 하면은....
:
: 제가 빌더를 이용하여 프로젝트를 진행 중인데, 기능별로 해서 모듈별로 나누어 놨고,
:
: 각 모듈을 DLL 형태로 만들어서 쓰려고 합니다.
:
: 근데, 각 모듈에서 공통으로 쓰이는 클래스들이 있어서 이걸 라이브러리 형태로 해서 별도의
:
: DLL로 만들었는데, 예를 들면 TMyBaseClass라고 이름을 짓는다면
:
: TMyBaseClass는 LIB.DLL에 있고, B.DLL에서 TMyBaseClass에서 상속받는 TMyWorkClass가
:
: 선언되어 있다고 할 때, TMyWorkClass object를 만들 때 다음과 같은 에러가 발생합니다.
:
: "Acess violation at address 4000574E in module 'rtl60.bpl'"
:
: 이런 방식이 사용 가능한건지 아니면 불가능 한건지? 가능하다면 어떻게 해야 하는지 알고 싶습니다.
:
: 수고하세요.
|