티스토리 뷰

Visual Studio 2015 ATL COM 서버 프로그래밍

사용환경은 윈도우10 입니다.

VS2015를 관리자 권한으로 실행해서 프로젝트를 만든다. 관리자 모드로 실행 안하면 아래 같은 컴파일 오류 발생한다. 오류 메시지 처럼 빌드할때 dll 만들고 레지스트리에 등록하는듯 하니 이 글 마지막 부분에 관리자 모드로 도스창 띄어 dll 파일을 레지스트리에 등록하고 있는데 굳이 필요는 없듯함. 단, Client에서 해당 dll 파일을 잘 import 해줘야 할 듯.

 

기능

COM 서버 : 계산 및 값 저장
COM 클라이언트 : 값 지정과 계산 옵션 지정

<COM서버 프로젝트>

COM 서버 프로젝트 이름 지정하고 나머지는 기본값을 사용한다.

(책에서는 위 창에서 '특성사용' 옵션을 해제 하라는데 VS2015 버전에는 없는거 같다.)

<프로젝트에 인터페이스 추가>

위 그림과 강티 프로젝트 Calculator 클래스에 마우스 포인터를 두고 왼쪽 버튼을 눌러 클래스를 선택하여 아래 그림과 같이 ATL 단순 개체를 선택한다.

C++ 약식이름과 COM ProgID에 이름을 입력하고 마침. (나머지 값은 기본값)

<추가된 인터페이스에 속성 추가> (cf. 멤버 변수)

위에서 추가한 ISimpleOperator 인터페이스에서 마우스 우측버튼 눌러 속성 추가 선택한다.

위 그림처럼 flaot형 X 변수를 추가한다. 그러면 Get/Put() 의 기본 코드가 자동 생성된다. 다른 값은 기본값.

똑같이 flaot형 Y도 추가해준다.

<메서드 추가> (cf. 멤버 함수)

위 그림에서와 같이 ISimpleOperator 인터페이스 위에 마우스 두고 왼쪽 버튼 눌러 메서드 추가 선택한다.

위 그림과 같이 메서드 이름과 매개 변수 형식, 매개 변수 이름을 지정하고 추가 버튼을 눌러

Add(DOUBLE* pVal) 을 추가한다.

같은 방법으로 Subtrsct, Multiply, Divide 메서드도 Add와 같은 매개 변수로 추가한다.

SimpleOperator.h 파일을 열고 아래 코드와 같이 멤버변수를 구현한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
class ATL_NO_VTABLE CSimpleOperator :
    public CComObjectRootEx<CComSingleThreadModel>,
    public CComCoClass<CSimpleOperator, &CLSID_SimpleOperator>,
    public IDispatchImpl<ISimpleOperator, &IID_ISimpleOperator, &LIBID_CalculatorLib, /*wMajor =*/ 1/*wMinor =*/ 0>
{
public:
    CSimpleOperator()
    {
        m_fX = 0// 추가
        m_fY = 0// 추가
    }
 
DECLARE_REGISTRY_RESOURCEID(IDR_SIMPLEOPERATOR)
 
 
BEGIN_COM_MAP(CSimpleOperator)
    COM_INTERFACE_ENTRY(ISimpleOperator)
    COM_INTERFACE_ENTRY(IDispatch)
END_COM_MAP()
 
 
 
    DECLARE_PROTECT_FINAL_CONSTRUCT()
 
    HRESULT FinalConstruct()
    {
        return S_OK;
    }
 
    void FinalRelease()
    {
    }
 
public:
 
 
 
    STDMETHOD(get_X)(FLOAT* pVal);
    STDMETHOD(put_X)(FLOAT newVal);
    STDMETHOD(get_Y)(FLOAT* pVal);
    STDMETHOD(put_Y)(FLOAT newVal);
    STDMETHOD(Add)(DOUBLE* pVal);
    STDMETHOD(Substract)(DOUBLE* pVal);
    STDMETHOD(Multiply)(DOUBLE* pVal);
    STDMETHOD(Divide)(DOUBLE* pVal);
    float m_fX; // 추가
    float m_fY; // 추가
};
 
OBJECT_ENTRY_AUTO(__uuidof(SimpleOperator), CSimpleOperator)
cs

 SimpleOperator.cpp 파일을 열고 get/put()와 Add() 등의 4칙연산 메소드를 구현한다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
STDMETHODIMP CSimpleOperator::get_X(FLOAT* pVal)
{
    // TODO: 여기에 구현 코드를 추가합니다.
    *pVal = m_fX;
    return S_OK;
}
 
 
STDMETHODIMP CSimpleOperator::put_X(FLOAT newVal)
{
    // TODO: 여기에 구현 코드를 추가합니다.
    m_fX = newVal;
    return S_OK;
}
 
 
STDMETHODIMP CSimpleOperator::get_Y(FLOAT* pVal)
{
    // TODO: 여기에 구현 코드를 추가합니다.
    *pVal = m_fY;
    return S_OK;
}
 
 
STDMETHODIMP CSimpleOperator::put_Y(FLOAT newVal)
{
    // TODO: 여기에 구현 코드를 추가합니다.
    m_fY = newVal;
    return S_OK;
}
 
 
STDMETHODIMP CSimpleOperator::Add(DOUBLE* pVal)
{
    // TODO: 여기에 구현 코드를 추가합니다.
    *pVal = m_fX + m_fY;
    return S_OK;
}
 
 
STDMETHODIMP CSimpleOperator::Substract(DOUBLE* pVal)
{
    // TODO: 여기에 구현 코드를 추가합니다.
    *pVal = m_fX - m_fY;
    return S_OK;
}
 
 
STDMETHODIMP CSimpleOperator::Multiply(DOUBLE* pVal)
{
    // TODO: 여기에 구현 코드를 추가합니다.
    *pVal = m_fX * m_fY;
    return S_OK;
}
 
 
STDMETHODIMP CSimpleOperator::Divide(DOUBLE* pVal)
{
    // TODO: 여기에 구현 코드를 추가합니다.
    if (m_fY == 0)
        return S_FALSE;
    else
        *pVal = m_fX / m_fY;
    return S_OK;
}
 
cs

Calculator 프로젝트를 빌드하면 dll 파일이 만들어 진다.

위 그림처럼 dll 파일이 있는 위치로 이동해서 RegSvr32 Calculator.dll 명령으로 dll 을 레지스트리에 등록한다. - 등록하지 않으면 Client에서 Intreface와 변수들을 인식 못함.

(책의 기본 내용을 충실하게 따라하지 않고 코딩 과정을 바로 따라해서 레지스트리에 등록해야 한 다는 설명은 없었으나 클라이언트 만들때 다이얼로그에 개체 참조를 하지 않고 있어 레지스트리에 추가한것임)

클라이언트 : http://petra.tistory.com/1008

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31