#include "stdafx.h"
#include <iostream>
#include <objbase.h>
using namespace std;
#define IID_ISetVal 1
#define IID_ICalcu 2
//
// 추상 인터페이스 선언
//
interface IMyUnknown
{
virtual HRESULT STDMETHODCALLTYPE QueryInterface( int iID, void **ppv) PURE;
virtual HRESULT STDMETHODCALLTYPE QueryInterface(LPCTSTR strName, void **ppv) PURE;
virtual void STDMETHODCALLTYPE ShowName() PURE;
};
//
// 추상 클래스 선언및 구현
//
class CIMyUnknown : public IMyUnknown
{
public:
CIMyUnknown();
~CIMyUnknown();
HRESULT __stdcall CIMyUnknown::QueryInterface(int iID, void **ppv);
HRESULT __stdcall CIMyUnknown::QueryInterface(LPCTSTR strName, void **ppv);
virtual void STDMETHODCALLTYPE ShowName();
IMyUnknown* CreateInstance();
};
HRESULT __stdcall CIMyUnknown::QueryInterface(int iID, void **ppv)
{
return S_OK;
}
HRESULT __stdcall CIMyUnknown::QueryInterface(LPCTSTR strName, void **ppv)
{
return S_OK;
}
void __stdcall CIMyUnknown::ShowName()
{
}
//
// 구현용 인터페이스 및 클래스 구현
//
interface ISetVal : IMyUnknown
{
virtual void __stdcall SetXY(int, int) PURE;
};
interface ICalcu : IMyUnknown
{
virtual int __stdcall Sum() PURE;
};
class CInsideCom : public ISetVal, ICalcu
{
public:
CInsideCom() {};
~CInsideCom() {};
virtual HRESULT __stdcall QueryInterface(int iID, void **ppv);
virtual HRESULT __stdcall QueryInterface(LPCTSTR strName, void **ppv);
virtual void __stdcall SetXY(int, int);
virtual int __stdcall Sum();
virtual void __stdcall ShowName();
private:
int x, y;
};
HRESULT __stdcall CInsideCom::QueryInterface(int iID, void **ppv)
{
if(iID == IID_ISetVal)
{
*ppv = static_cast<ISetVal *>(this);
}
else if(iID == IID_ICalcu)
{
*ppv = static_cast<ICalcu *>(this);
}
else {
*ppv = NULL;
return E_NOINTERFACE;
}
return S_OK;
}
HRESULT __stdcall CInsideCom::QueryInterface(LPCTSTR strName, void **ppv)
{
if(0 == wcscmp( strName, _T("ISetVal")))
{
*ppv = static_cast<ISetVal *>(this);
}
else if(0 == wcscmp( strName, _T("ICalcu")))
{
*ppv = static_cast<ICalcu *>(this);
}
else {
*ppv = NULL;
return E_NOINTERFACE;
}
return S_OK;
}
void __stdcall CInsideCom::ShowName()
{
cout << "Impl Class";
}
void __stdcall CInsideCom::SetXY(int x1, int y1)
{
x = x1;
y = y1;
}
int __stdcall CInsideCom::Sum()
{
return x+y;
}
IMyUnknown* CreateInstance()
{
IMyUnknown *pI=NULL;
pI = static_cast<ISetVal*>(new CInsideCom());
return pI;
}
void main()
{
int x, y;
cout << "Input Integer Number x and y : ";
cin >> x >> y;
IMyUnknown* pIMyUnknown = NULL;
ISetVal* pISetVal = NULL;
ICalcu* pICalcu = NULL;
pIMyUnknown = CreateInstance();
if(pIMyUnknown)
{
/*
HRESULT hr = pIMyUnknown->QueryInterface(1, (LPVOID*)&pISetVal);
if(SUCCEEDED(hr))
{
pISetVal->SetXY(x,y);
hr = pIMyUnknown->QueryInterface(2, (LPVOID*)&pICalcu);
cout << "The Sum of x + y : " << pICalcu->Sum() << endl;
pISetVal->ShowName();
}
delete pIMyUnknown;
*/
HRESULT hr = pIMyUnknown->QueryInterface(_T("ISetVal"), (LPVOID*)&pISetVal);
if(SUCCEEDED(hr))
{
pISetVal->SetXY(x,y);
hr = pIMyUnknown->QueryInterface(_T("ICalcu"), (LPVOID*)&pICalcu);
cout << "The Sum of x + y : " << pICalcu->Sum() << endl;
pISetVal->ShowName();
}
delete pIMyUnknown;
}
}
분명 포스팅해두면 도움이 되리라 믿는다... .
