C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[28687] Visual C++ 에서 만든 DLL 을 사용하는데 이런 에러는 무슨..
김현중 [mesya] 1047 읽음    2004-02-02 18:17
안녕하세요. 최종 질문 올립니다.

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 이렇게 밀린겁니다..

이유가 무엇일까요? ㅜㅜ


+ -

관련 글 리스트
28687 Visual C++ 에서 만든 DLL 을 사용하는데 이런 에러는 무슨.. 김현중 1047 2004/02/02
34416     Re:Visual C++ 에서 만든 DLL 을 사용하는데 이런 에러는 무슨.. 김현중 935 2004/02/02
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.