'interface'에 해당되는 글 1건

  1. 2008/07/23 세상에서 가장 간단한 추상인터페이스 (2)

#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;
 }
}


분명 포스팅해두면 도움이 되리라 믿는다... .
크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by Rhea君
TAG