티스토리 뷰
Visual Studio 2015 COM 클라이언트 프로그래밍
서버 : http://petra.tistory.com/1007
ATL COM 사용전 등록하기 http://petra.tistory.com/1009
여기서도 Visual Studio 2015를 관리자 권한으로 실행해야 하는건지는 모르겠으나 일단 관리자 권한으로 실행했다. 굳이 관리자 모드로 실행 안되해도 됨.
클라이언트 프로젝트를 추가하라고 했는데 별도의 프로젝트로 만들어 해보니 컴파일 에러가 나서 별도로 만든 프로젝트를 계산기 서버 프로젝트에서 기존 프로젝트 추가로 해서 하니 해결되었다.
(위에 'ATL COM 사용 전 등록하기' 로 하면 프로젝트를 나눠도 된다.)
다이얼로그 기반의 프로젝트를 만든다.
위 그림과 같이 다이얼로그에 컨트롤 배치하고, eidt와 Static은 컨트롤변수로 추가한다.
4칙연산 결과는 Static에 표시 한다.
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 |
//#import "C:\Users\USER\Documents\Visual Studio 2015\Projects\Calculator\Debug\Calculator.dll" raw_interfaces_only
//#import "..\Calculator.dll" raw_interface_only
//#import "..\..\Calculator\Debug\Calculator.dll" raw_interfaces_only
#import "Calculator.dll" raw_interfaces_only // 서버와 별개의 프로젝트로 만든 경우 no_namespace named_guids 로 변경한다.
using namespace CalculatorLib; // 아래 Calculator.idl 파일의 값을 넣는건지 모름
// CCalcClientDlg 대화 상자
class CCalcClientDlg : public CDialogEx
{
// 생성입니다.
public:
CCalcClientDlg(CWnd* pParent = NULL); // 표준 생성자입니다.
// 대화 상자 데이터입니다.
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_CALCCLIENT_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 지원입니다.
// 구현입니다.
protected:
HICON m_hIcon;
// 생성된 메시지 맵 함수
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
float m_fX;
float m_fY;
CString m_csResult;
afx_msg void OnBnClickedButtonSetx();
afx_msg void OnBnClickedButtonGetx();
afx_msg void OnBnClickedButtonSety();
afx_msg void OnBnClickedButtonGety();
afx_msg void OnBnClickedButtonAdd();
afx_msg void OnBnClickedButtonSubstract();
afx_msg void OnBnClickedButtonMultiply();
afx_msg void OnBnClickedButtonDivide();
CComPtr<ISimpleOperator> m_spSO;
};
|
cs |
1~4행까지 해 봤으나 컴파일 에러나서 결국 서버 dll 파일을 클라이언트 실행파일이 있는 곳에 복사했다.
5행은 네임스페이스를 꼭 해줘야 하는지 모르겠으나 없으면 컴파일 에러 난다. - 서버와 별개의 프로젝트로 한 경우 4행에서 raw_interfaces_only 대신 no_namespace named_guids 로 변경한다.
(아래 서버 프로젝트의 Calculator.idl 파일에 자동 생성된 코드 참조)
1
2
3
4
5
6
7
8
9
10
11
12 |
// Calculator.idl
library CalculatorLib
{
importlib("stdole2.tlb");
[
uuid(39D8228F-4816-4E39-B7F6-543F7B841289)
]
coclass SimpleOperator
{
[default] interface ISimpleOperator;
};
}; |
cs |
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89 |
void CCalcClientDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
DDX_Text(pDX, IDC_EDIT_X, m_fX);
DDX_Text(pDX, IDC_EDIT_Y, m_fY);
DDX_Text(pDX, IDC_STATIC_RESULT, m_csResult);
}
void CCalcClientDlg::OnBnClickedButtonSetx()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
if (UpdateData())
{
m_spSO->put_X(m_fX);
m_csResult.Format(L"프로퍼티 X에 (%f) 값을 넣었습니다.", m_fX);
UpdateData(FALSE);
}
}
void CCalcClientDlg::OnBnClickedButtonGetx()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
m_spSO->get_X(&m_fX);
m_csResult.Format(L"프로퍼티 X로부터 (%f) 값을 얻었습니다.", m_fX);
UpdateData(FALSE);
}
void CCalcClientDlg::OnBnClickedButtonSety()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
if (UpdateData())
{
m_spSO->put_Y(m_fY);
m_csResult.Format(L"프로퍼티 Y에 (%f) 값을 넣었습니다.", m_fY);
UpdateData(FALSE);
}
}
void CCalcClientDlg::OnBnClickedButtonGety()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
m_spSO->get_Y(&m_fY);
m_csResult.Format(L"프로퍼티 Y로부터 (%f) 값을 얻었습니다.", m_fY);
UpdateData(FALSE);
}
void CCalcClientDlg::OnBnClickedButtonAdd()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
double rst;
m_spSO->Add(&rst);
m_csResult.Format(L"Add 메소드가 (%f) 값을 리턴했습니다.", rst);
UpdateData(FALSE);
}
void CCalcClientDlg::OnBnClickedButtonSubstract()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
double rst;
m_spSO->Substract(&rst);
m_csResult.Format(L"Substract 메소드가 (%f) 값을 리턴했습니다.", rst);
UpdateData(FALSE);
}
void CCalcClientDlg::OnBnClickedButtonMultiply()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
double rst;
m_spSO->Multiply(&rst);
m_csResult.Format(L"Multiply 메소드가 (%f) 값을 리턴했습니다.", rst);
UpdateData(FALSE);
}
void CCalcClientDlg::OnBnClickedButtonDivide()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
double rst;
m_spSO->Divide(&rst);
m_csResult.Format(L"Divide 메소드가 (%f) 값을 리턴했습니다.", rst);
UpdateData(FALSE);
} |
cs |
소스.zip