검색결과 리스트
글
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 |
RECENT COMMENT