티스토리 뷰
사용환경은 윈도우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