KOALA.CPP
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:2k
源码类别:

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * KOALA.CPP
  3.  * Koala Object Independent of DLL/EXE Servers, Chapter 5
  4.  *
  5.  * Implementation of the CKoala object that works in either
  6.  * an EXE or DLL as it only implements IUnknown.
  7.  *
  8.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  9.  *
  10.  * Kraig Brockschmidt, Microsoft
  11.  * Internet  :  kraigb@microsoft.com
  12.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  13.  */
  14. #include "koala.h"
  15. /*
  16.  * CKoala::CKoala
  17.  * CKoala::~CKoala
  18.  *
  19.  * Parameters (Constructor):
  20.  *  pUnkOuter       LPUNKNOWN of a controlling unknown.
  21.  *  pfnDestroy      PFNDESTROYED to call when an object
  22.  *                  is destroyed.
  23.  */
  24. CKoala::CKoala(LPUNKNOWN pUnkOuter, PFNDESTROYED pfnDestroy)
  25.     {
  26.     m_cRef=0;
  27.     m_pUnkOuter=pUnkOuter;
  28.     m_pfnDestroy=pfnDestroy;
  29.     return;
  30.     }
  31. CKoala::~CKoala(void)
  32.     {
  33.     return;
  34.     }
  35. /*
  36.  * CKoala::Init
  37.  *
  38.  * Purpose:
  39.  *  Performs any intiailization of a CKoala that's prone to failure
  40.  *  that we also use internally before exposing the object outside.
  41.  *
  42.  * Parameters:
  43.  *  None
  44.  *
  45.  * Return Value:
  46.  *  BOOL            TRUE if the function is successful,
  47.  *                  FALSE otherwise.
  48.  */
  49. BOOL CKoala::Init(void)
  50.     {
  51.     //Nothing to do.
  52.     return TRUE;
  53.     }
  54. /*
  55.  * CKoala::QueryInterface
  56.  * CKoala::AddRef
  57.  * CKoala::Release
  58.  *
  59.  * Purpose:
  60.  *  IUnknown members for CKoala object.
  61.  */
  62. STDMETHODIMP CKoala::QueryInterface(REFIID riid, PPVOID ppv)
  63.     {
  64.     *ppv=NULL;
  65.     /*
  66.      * The only calls for IUnknown are either in a nonaggregated
  67.      * case or when created in an aggregation, so in either case
  68.      * always return our IUnknown for IID_IUnknown.
  69.      */
  70.     if (IID_IUnknown==riid)
  71.         *ppv=this;
  72.     if (NULL!=*ppv)
  73.         {
  74.         ((LPUNKNOWN)*ppv)->AddRef();
  75.         return NOERROR;
  76.         }
  77.     return ResultFromScode(E_NOINTERFACE);
  78.     }
  79. STDMETHODIMP_(ULONG) CKoala::AddRef(void)
  80.     {
  81.     return ++m_cRef;
  82.     }
  83. STDMETHODIMP_(ULONG) CKoala::Release(void)
  84.     {
  85.     if (0L!=--m_cRef)
  86.         return m_cRef;
  87.     /*
  88.      * Tell the housing that an object is going away so it can
  89.      * shut down if appropriate.
  90.      */
  91.     if (NULL!=m_pfnDestroy)
  92.         (*m_pfnDestroy)();
  93.     delete this;
  94.     return 0;
  95.     }