Post

DLL을 통한 기능 확장 - #2

이제 DLL에서 필요한 함수들을 노출시키는 방법에 대해 알아보도록 하자.

예를 보면서 이야기 하는것이 빠를것이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifdef HOLEDATA_EXPORTS
    #define HOLEDATA_EXT_CLASS        __declspec(dllexport)
#else
    #define HOLEDATA_EXT_CLASS        __declspec(dllimport)
#endif

static DataTypeMap __DataTypeMap[]=
{

    {CHole::TypeString , CHole::GetInstance}
};

extern "C" HOLEDATA_EXT_CLASS const unsigned int DllGetDataTypeMapCount()
{
    return (sizeof(__DataTypeMap) / sizeof(__DataTypeMap[0]));
}

extern "C" HOLEDATA_EXT_CLASS DataTypeMap* DllGetDataTypeMap()
{
    return __DataTypeMap;
}

예를 보면 두개의 함수를 제공하고 있다.

하나는 배열의 크기 , 다른 하나는 배열의 포인터를 넘겨주는 함수이다.

DataTypeMap이라는 구조체는 아이템의 keyword , 해당 아이템을 처리할수 있는 클래스(여기서는 CHole이라는 클래스)를 생성하는 함수 포인터로 구성되어 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class HOLEDATA_EXT_CLASS CHole : public CPDMSData 
{
public:
    const char* type() const;
    double size() const;
    CIsVect3d axis() const;
    CIsPoint3d  origin() const;
    virtual void Parse(CDataScanner* pScanner);
    CHole();
    virtual ~CHole();
    IS_DECLARE_DATA_FUNC()
private:
    void CalcVolume();
    CIsPoint3d m_origin;
    CIsVect3d  m_axis;
    double     m_size;
    double     m_rotate;
    char       m_szPanelRef[NAME_BUF_SIZE];
    char       m_szHoleType[NAME_BUF_SIZE];
};