IUNKNOWN.CPP
/* 
 * IUNKNOWN.CPP 
 * 
 * Template implementation of a delegating IUnknown. 
 * 
 * Copyright (c)1993-1996 Microsoft Corporation, All Rights Reserved 
 * 
 * Kraig Brockschmidt, Software Design Engineer 
 * Microsoft Systems Developer Relations 
 * 
 * Internet  :  kraigb@microsoft.com 
 * Compuserve:  >INTERNET:kraigb@microsoft.com 
 */ 
 
 
#include "iunknown.h" 
 
 
 
/* 
 * CImpIUnknown::CImpIUnknown 
 * CImpIUnknown::~CImpIUnknown 
 * 
 * Constructor Parameters: 
 *  pObj            LPVOID of the object containing us. 
 *  pUnkOuter       LPUNKNOWN to which we blindly delegate 
 *                  all IUnknown calls. 
 */ 
 
CImpIUnknown::CImpIUnknown(LPVOID pObj, LPUNKNOWN pUnkOuter) 
    { 
    m_cRef=0; 
    m_pObj=pObj; 
 
    /* 
     * We don't need to AddRef pUnkOuter since it defines 
     * our lifetime. 
     */ 
    m_pUnkOuter=pUnkOuter; 
    return; 
    } 
 
 
CImpIUnknown::~CImpIUnknown(void) 
    { 
    return; 
    } 
 
 
 
 
 
 
/* 
 * CImpIUnknown::QueryInterface 
 * 
 * Purpose: 
 *  Delegate to whoever is providing IUnknown implementations 
 *  for this interface.  May be our containing object, may be 
 *  a controlling unknown.  We don't care. 
 * 
 * Parameters: 
 *  riid            REFIID being asked for. 
 *  ppv             LPVOID * in which to return the interface. 
 * 
 * Return Value: 
 *  HRESULT         NOERROR if successful, otherwise contains 
 *                  E_NOINTERFACE. 
 */ 
 
STDMETHODIMP CImpIUnknown::QueryInterface(REFIID riid 
    , LPVOID *ppv) 
    { 
    return m_pUnkOuter->QueryInterface(riid, ppv); 
    } 
 
 
 
 
 
/* 
 * CImpIUnknown::AddRef 
 * 
 * Purpose: 
 *  Increments the interface reference count (for debugging) and 
 *  delegates to whoever is controlling this interface. 
 * 
 * Parameters: 
 *  None 
 * 
 * Return Value: 
 *  ULONG           New reference count of the object. 
 */ 
 
STDMETHODIMP_(ULONG) CImpIUnknown::AddRef(void) 
    { 
    ++m_cRef; 
    return m_pUnkOuter->AddRef(); 
    } 
 
 
 
 
 
 
/* 
 * CImpIUnknown::Release 
 * 
 * Purpose: 
 *  Decrements the interface reference count (for debugging) and 
 *  delegates to whoever is controlling this interface. 
 * 
 * Parameters: 
 *  None 
 * 
 * Return Value: 
 *  ULONG           Current reference count after decrement.  If 
 *                  this returns zero then the interface is no 
 *                  longer valid because the object is dead. 
 */ 
 
STDMETHODIMP_(ULONG) CImpIUnknown::Release(void) 
    { 
    --m_cRef; 
    return m_pUnkOuter->Release(); 
    }