COM 개체를 생성하고 인터페이스 포인터를 얻는다.
생성된 개체는 인터페이스 포인터에 레퍼런스 카운트된다.
IUnknown
.QueryInterface()
.AddRef()
.Release()
// C++
DECLARE_INTERFACE_(ICalculator, IDispatch)
{
STDMETHOD(Add)(THIS_ long a, long b, long *c) PURE;
STDMETHOD(Sub)(THIS_ long a, long b, long *c) PURE;
};
class CCalcClientDlg : public CDialog
{
...
// Generated message map functions
//{{AFX_MSG(CCalcClientDlg)
...
afx_msg void OnAdd();
...
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
ICalculator *m_ICalculator;
};
BEGIN_MESSAGE_MAP(CCalcClientDlg, CDialog)
//{{AFX_MSG_MAP(CCalcClientDlg)
...
ON_BN_CLICKED(IDC_ADD, OnAdd)
...
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
...
BOOL CCalcClientDlg::OnInitDialog()
{
...
SetIcon(m_hIcon, FALSE); // Set small icon
// {
HRESULT hr = CoCreateInstance( CLSID_Calculator, NULL,
CLSCTX_INPROC_SERVER, IID_Calculator, (void**) &m_ICalculator);
if(FAILED(hr))
AfxMessageBox(_T("서버 연결에 실패하였습니다."));
// }
return TRUE; // return TRUE unless you set the focus to a control
}
...
void CCalcClientDlg::OnAdd()
{
UpdateData();
m_ICalculator->Add(m_A, m_B, &m_Result);
UpdateData(FALSE);
}
...
// 스마트 포인터
#import ".../AtlCalc.tlb" no_namespace
class CSmartPtrClientDlg : public CDialog
{
...
// Generated message map functions
//{{AFX_MSG(CSmartPtrClientDlg)
...
afx_msg void OnAdd();
...
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
private:
ICalculatorPtr m_ICalculatorPtr;
};
BOOL CSmartPtrClientDlg::OnInitDialog()
{
...
SetIcon(m_hIcon, FALSE); // Set small icon
// {
HRESULT hr = m_ICalculatorPtr.CreateInstance("ATLCalc.Calculator");
if(FAILED(hr))
AfxMessageBox(_T("서버 연결에 실패하였습니다."));
// }
return TRUE; // return TRUE unless you set the focus to a control
}