|
안녕하세요. 최종 질문 올립니다.
visual c++ 에서 만든 DLL 에서 클래스를 사용하기 위해,
가상인터페이스 클래스를 하나 설정해놓고, DLL 내부에서 실제 클래스를 할당받아,
메모리포인터를 넘겨주었습니다. 소스를 보심이 편하실듯......
일단 DLL 을 살펴보자면
//////////////////////////////////////////////////////////////////////////////
// HEADER
//////////////////////////////////////////////////////////////////////////////
// interface 클래스
class IAVATARDLL
{
public:
virtual void test(int a, int b, int c) {};
};
#define CREATEAVATARDLL_MAP "CreateEngine"
#define DESTROYAVATARDLL_MAP "DestroyEngine"
typedef IAVATARDLL* (*PROC_CREATEAVATARDLL)();
typedef void (*PROC_DESTROYAVATARDLL)(IAVATARDLL*);
// 실제 클래스
class CAVATARDLL : public IAVATARDLL
{
public:
virtual void test(int a, int b, int c);
};
//////////////////////////////////////////////////////////////////////////////
// SOURCE
//////////////////////////////////////////////////////////////////////////////
#ifdef _DLLEXPORT
#define DLLAPI __declspec(dllexport)
#else
#define DLLAPI __declspec(dllimport)
#endif
DLLAPI IAVATARDLL* CreateEngine()
{
return new CAVATARDLL;
}
DLLAPI void DestroyEngine(IAVATARDLL* lpEngine)
{
delete (CAVATARDLL*)lpEngine;
}
void CAVATARDLL::test(int a, int b, int c)
{
char buf[256];
sprintf(buf, "%d %d %d", a, b, c);
MessageBox(NULL, buf, buf, MB_OK);
}
이런식으로 만들어져있습니다. CreateEngine 을 통해 클래스의 메모리 포인터를 얻어오는겁니다.
DLL 을 사용하는 C++ Builder 프로그램에선
IAVATARDLL* CAvatar = NULL;
HMODULE hAvatarDLL = NULL;
PROC_CREATEAVATARDLL CreateEngine = NULL;
PROC_DESTROYAVATARDLL DestroyEngine = NULL;
hAvatarDLL = LoadLibrary("../EZAvatar.dll");
if( !hAvatarDLL )
exit(0);
if( !(CreateEngine = (PROC_CREATEAVATARDLL)GetProcAddress(hAvatarDLL, CREATEAVATARDLL_MAP)) )
exit(0);
if( !(DestroyEngine = (PROC_DESTROYAVATARDLL)GetProcAddress(hAvatarDLL, DESTROYAVATARDLL_MAP)) )
exit(0);
CAvatar = CreateEngine();
CAvatar->test(1, 2, 3);
이런식으로 사용을 합니다.
CAvatar->test(1,2,3); < 이렇게 실행을 할경우 1, 2, 3 이란 메세지 박스가 떠야 하는데
14232323, 1, 2 란 메세지 박스가 뜹니다.
넘겨보낸 인자가 하나씩 밀린거죠...
원래대로라면 a = 1, b = 2, c = 3 일텐데,
a = ??, b = 1, c = 2 이렇게 밀린겁니다..
이유가 무엇일까요? ㅜㅜ
|