GEMS 2권 DLL로 부터 C++클래스 내보내기

GEMS 2016. 1. 22. 17:27


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#ifdef _BUILDING_MY_DLL
#define DLLFUNCTION __declspec(dllexport// DLL을 빌드하는 경우 
이것이 정의된다.
#else
#define DLLFUNCTION __declspec(dllimport// 응용 프로그램을 빌드하는 경우 
이것이 정의된다.
#endif
 
class DLLFUNCTION CMyExportedClass
{
    public:
        CMyExportedClass(void) : mdwValue(0) {}
        void setValue(long dwValue) { mdwValue = dwValue; }
        long getValue(void) { return mdwValue; }
        long clearValue(void);
    private:
        long mdwValue;
};
cs


하지만 이 인스턴스롤 소멸시킬때 문제가 되는데 그런 문제를 방지하기 위해서 DLL에서 도우미 함수를 호출해서 소멸시키도록 하는 것이 좋다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#ifdef _BUILDING_MY_DLL
#define DLLFUNCTION __declspec(dllexport// DLL을 빌드하는 경우
 이것이 정의된다.
#else
#define DLLFUNCTION __declspec(dllimport// 응용 프로그램을 빌드하는 경우
 이것이 정의된다.
#endif
 
class  CMyExportedClass
{
    public:
        CMyExportedClass(void) : mdwValue(0) {}
        DLLFUNCTION void setValue(long dwValue) { mdwValue = dwValue; }
        DLLFUNCTION long getValue(void) { return mdwValue; }
        long clearValue(void);
    private:
        long mdwValue;
};
 
CMyExportedClass *createMyExportedClass(void) {
    return new CMyExportedClass;
}
void deleteMyExportedClass ( CMyExportedClass *pclass) {
    delete pclass;
}
cs

사용자가 도우미 함수를 무시하고 객체를 생성하고 소멸하는것을 막기위해서 클래스 자체를 내보내는 대신 생성과 소멸에 관한 함수들을 내보내지 않는것이다.


가상 클래스 멤버 함수 내보내기

클래스로 부터 멤버함수를 내보낼 때 unresolved external symbol 이 나타날 때 가 있다.

실행시점에서 LoadLibrary 함수르 DLL을 로드하는 경우, 인라인 함수를 비활성화 시킨상태에서 빌드 할 경우

인라인 함수 확장 옵션을 "Only __inline"이나 "Any Suitable"로 설정하는 것도 있지만

멤버함수를 virtual로 선언해서 내보내도 해결할 수 있다. 인라인 확장에 관련된 문제도 피할 수 있다.


DLL으로 부터 클래스를 내보내는 것은 소스코드를 공개하지 않고도 기능성을 공유하기 위한 쉽고도 강력한 방법이다.




'GEMS' 카테고리의 다른 글

GEMS 2권(6)  (0) 2016.02.04
GEMS 2권 (5)  (0) 2016.02.03
GEMS 2권 추상 인터페이스  (0) 2016.01.22
GEMS 2권 인라인 VS 매크로  (0) 2016.01.21
GEMS 2권 (1)  (0) 2016.01.21
posted by 알쿠미