home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / inole2 / chap02 / reuse / koalac.cpp < prev    next >
C/C++ Source or Header  |  1995-05-03  |  6KB  |  344 lines

  1. /*
  2.  * KOALAC.CPP
  3.  *
  4.  * Koala Object Reusing Animal via Containment, Chapter 2
  5.  *
  6.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  7.  *
  8.  * Kraig Brockschmidt, Microsoft
  9.  * Internet  :  kraigb@microsoft.com
  10.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  11.  */
  12.  
  13. #include <windows.h>
  14. #include "reuse.h"
  15. #include "koalac.h"
  16.  
  17.  
  18. /*
  19.  * CreateKoalaContainment
  20.  *
  21.  * Purpose:
  22.  *  Creates an instance of KoalaC returning an IUnknown
  23.  *  interface.
  24.  *
  25.  * Parameters:
  26.  *  ppUnk           IUnknown ** in which to return the pointer.
  27.  *
  28.  * Return Value:
  29.  *  BOOL            TRUE if successful, FALSE otherwise.
  30.  */
  31.  
  32. BOOL CreateKoalaContainment(IUnknown **ppUnk)
  33.     {
  34.     CKoalaC    *pObj;
  35.     HRESULT     hr;
  36.  
  37.     pObj=new CKoalaC();
  38.  
  39.     if (NULL==pObj)
  40.         return FALSE;
  41.  
  42.     if (!pObj->Init())
  43.         return FALSE;
  44.  
  45.     hr=pObj->QueryInterface(IID_IUnknown, (PPVOID)ppUnk);
  46.     return SUCCEEDED(hr);
  47.     }
  48.  
  49.  
  50.  
  51.  
  52.  
  53. /*
  54.  * CKoalaC::CKoalaC
  55.  * CKoalaC::~CKoalaC
  56.  *
  57.  * Constructor Parameters:
  58.  *  None
  59.  */
  60.  
  61. CKoalaC::CKoalaC(void)
  62.     {
  63.     m_cRef=0;
  64.     m_pImpIAnimal=NULL;
  65.     m_pImpIKoala=NULL;
  66.  
  67.     m_pIAnimal=NULL;
  68.     return;
  69.     }
  70.  
  71. CKoalaC::~CKoalaC(void)
  72.     {
  73.     ReleaseInterface(m_pIAnimal);
  74.  
  75.     DeleteInterfaceImp(m_pImpIKoala);
  76.     DeleteInterfaceImp(m_pImpIAnimal);
  77.     return;
  78.     }
  79.  
  80.  
  81.  
  82. /*
  83.  * CKoalaC::Init
  84.  *
  85.  * Purpose:
  86.  *  Instantiates the interface implementations for this object.
  87.  *
  88.  * Parameters:
  89.  *  None
  90.  *
  91.  * Return Value:
  92.  *  BOOL            TRUE if initialization succeeds, FALSE otherwise.
  93.  */
  94.  
  95. BOOL CKoalaC::Init(void)
  96.     {
  97.     HRESULT     hr;
  98.  
  99.     //Create our interface
  100.     m_pImpIAnimal=new CImpIAnimal_K(this);
  101.  
  102.     if (NULL==m_pImpIAnimal)
  103.         return FALSE;
  104.  
  105.     m_pImpIKoala=new CImpIKoala_C(this);
  106.  
  107.     if (NULL==m_pImpIKoala)
  108.         return FALSE;
  109.  
  110.     /*
  111.      * Create an instance of the Animal object and save an
  112.      * IAnimal pointer.  We use Animal's global API function
  113.      * for this.
  114.      */
  115.     hr=CreateAnimal(NULL, IID_IAnimal, (void **)&m_pIAnimal);
  116.  
  117.     if (FAILED(hr))
  118.         return FALSE;
  119.  
  120.     return TRUE;
  121.     }
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128. /*
  129.  * CKoalaC::QueryInterface
  130.  * CKoalaC::AddRef
  131.  * CKoalaC::Release
  132.  *
  133.  * Purpose:
  134.  *  KoalaC's IUnknown implementation.
  135.  */
  136.  
  137. STDMETHODIMP CKoalaC::QueryInterface(REFIID riid, PPVOID ppv)
  138.     {
  139.     *ppv=NULL;
  140.  
  141.     if (IID_IUnknown==riid)
  142.         *ppv=this;
  143.  
  144.     if (IID_IAnimal==riid)
  145.         *ppv=m_pImpIAnimal;
  146.  
  147.     if (IID_IKoala==riid)
  148.         *ppv=m_pImpIKoala;
  149.  
  150.     if (NULL==*ppv)
  151.         return ResultFromScode(E_NOINTERFACE);
  152.  
  153.     ((LPUNKNOWN)*ppv)->AddRef();
  154.     return NOERROR;
  155.     }
  156.  
  157.  
  158. DWORD CKoalaC::AddRef(void)
  159.     {
  160.     return ++m_cRef;
  161.     }
  162.  
  163. DWORD CKoalaC::Release(void)
  164.     {
  165.     if (0!=--m_cRef)
  166.         return m_cRef;
  167.  
  168.     delete this;
  169.     return 0;
  170.     }
  171.  
  172.  
  173.  
  174.  
  175. //CImpIAnimal_K interface implementation
  176.  
  177.  
  178. /*
  179.  * CImpIAnimal_K::CImpIAnimal_K
  180.  * CImpIAnimal_K::~CImpIAnimal_K
  181.  *
  182.  * Constructor Parameters:
  183.  *  pObj            PCKoalaC to the outer object
  184.  */
  185.  
  186. CImpIAnimal_K::CImpIAnimal_K(PCKoalaC pObj)
  187.     {
  188.     m_cRef=0;
  189.     m_pObj=pObj;
  190.     return;
  191.     }
  192.  
  193. CImpIAnimal_K::~CImpIAnimal_K(void)
  194.     {
  195.     return;
  196.     }
  197.  
  198.  
  199.  
  200. /*
  201.  * CImpIAnimal_K::QueryInterface
  202.  * CImpIAnimal_K::AddRef
  203.  * CImpIAnimal_K::Release
  204.  *
  205.  * IUnknown members that delegate to KoalaC
  206.  */
  207.  
  208. STDMETHODIMP CImpIAnimal_K::QueryInterface(REFIID riid, PPVOID ppv)
  209.     {
  210.     return m_pObj->QueryInterface(riid, ppv);
  211.     }
  212.  
  213. DWORD CImpIAnimal_K::AddRef(void)
  214.     {
  215.     ++m_cRef;
  216.     return m_pObj->AddRef();
  217.     }
  218.  
  219. DWORD CImpIAnimal_K::Release(void)
  220.     {
  221.     --m_cRef;
  222.     return m_pObj->Release();
  223.     }
  224.  
  225.  
  226.  
  227. /*
  228.  * CImpIAnimal_K::Eat
  229.  * CImpIAnimal_K::Sleep
  230.  * CImpIAnimal_K::Procreate
  231.  *
  232.  * Purpose:
  233.  *  Empty sample functions, no parameters, return NOERROR
  234.  */
  235.  
  236. STDMETHODIMP CImpIAnimal_K::Eat(void)
  237.     {
  238.     ODS("KoalaC's IAnimal::Eat called");
  239.  
  240.     //Call contained object
  241.     m_pObj->m_pIAnimal->Eat();
  242.     return NOERROR;
  243.     }
  244.  
  245. STDMETHODIMP CImpIAnimal_K::Sleep(void)
  246.     {
  247.     ODS("KoalaC's IAnimal::Sleep called");
  248.  
  249.     //Call contained object
  250.     m_pObj->m_pIAnimal->Sleep();
  251.     return NOERROR;
  252.     }
  253.  
  254. STDMETHODIMP CImpIAnimal_K::Procreate(void)
  255.     {
  256.     ODS("KoalaC's IAnimal::Procreate called");
  257.  
  258.     //Call contained object
  259.     m_pObj->m_pIAnimal->Procreate();
  260.     return NOERROR;
  261.     }
  262.  
  263.  
  264.  
  265.  
  266. //CImpIKoala_C interface implementation
  267.  
  268.  
  269. /*
  270.  * CImpIKoala_C::CImpIKoala_C
  271.  * CImpIKoala_C::~CImpIKoala_C
  272.  *
  273.  * Constructor Parameters:
  274.  *  pObj            PCKoalaC to the outer object
  275.  */
  276.  
  277. CImpIKoala_C::CImpIKoala_C(PCKoalaC pObj)
  278.     {
  279.     m_cRef=0;
  280.     m_pObj=pObj;
  281.     return;
  282.     }
  283.  
  284. CImpIKoala_C::~CImpIKoala_C(void)
  285.     {
  286.     return;
  287.     }
  288.  
  289.  
  290.  
  291. /*
  292.  * CImpIKoala_C::QueryInterface
  293.  * CImpIKoala_C::AddRef
  294.  * CImpIKoala_C::Release
  295.  *
  296.  * IUnknown members that delegate to KoalaC
  297.  */
  298.  
  299. STDMETHODIMP CImpIKoala_C::QueryInterface(REFIID riid, PPVOID ppv)
  300.     {
  301.     return m_pObj->QueryInterface(riid, ppv);
  302.     }
  303.  
  304. DWORD CImpIKoala_C::AddRef(void)
  305.     {
  306.     ++m_cRef;
  307.     return m_pObj->AddRef();
  308.     }
  309.  
  310. DWORD CImpIKoala_C::Release(void)
  311.     {
  312.     --m_cRef;
  313.     return m_pObj->Release();
  314.     }
  315.  
  316.  
  317.  
  318. /*
  319.  * CImpIKoala_C::ClimbEucalyptusTrees
  320.  * CImpIKoala_C::PouchOpensDown
  321.  * CImpIKoala_C::SleepForHoursAfterEating
  322.  *
  323.  * Purpose:
  324.  *  Empty sample functions, no parameters, return NOERROR
  325.  */
  326.  
  327. STDMETHODIMP CImpIKoala_C::ClimbEucalyptusTrees(void)
  328.     {
  329.     ODS("KoalaC's IKoala::ClimbEucalyptusTrees called");
  330.     return NOERROR;
  331.     }
  332.  
  333. STDMETHODIMP CImpIKoala_C::PouchOpensDown(void)
  334.     {
  335.     ODS("KoalaC's IKoala::PouchOpensDown called");
  336.     return NOERROR;
  337.     }
  338.  
  339. STDMETHODIMP CImpIKoala_C::SleepForHoursAfterEating(void)
  340.     {
  341.     ODS("KoalaC's IKoala::SleepForHoursAfterEating called");
  342.     return NOERROR;
  343.     }
  344.