home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / winui / shell / regview / clsfact.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-27  |  4.2 KB  |  160 lines

  1. /**************************************************************************
  2.    THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  3.    ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  4.    THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  5.    PARTICULAR PURPOSE.
  6.  
  7.    Copyright 1997 Microsoft Corporation.  All Rights Reserved.
  8. **************************************************************************/
  9.  
  10. /**************************************************************************
  11.  
  12.    File:          ClsFact.cpp
  13.    
  14.    Description:   Implements CClassFactory.
  15.  
  16. **************************************************************************/
  17.  
  18. /**************************************************************************
  19.    #include statements
  20. **************************************************************************/
  21.  
  22. #include "ClsFact.h"
  23.  
  24. /**************************************************************************
  25.    private function prototypes
  26. **************************************************************************/
  27.  
  28. /**************************************************************************
  29.    global variables
  30. **************************************************************************/
  31.  
  32. ///////////////////////////////////////////////////////////////////////////
  33. //
  34. // IClassFactory implementation
  35. //
  36.  
  37. /**************************************************************************
  38.  
  39.    CClassFactory::CClassFactory
  40.  
  41. **************************************************************************/
  42.  
  43. CClassFactory::CClassFactory()
  44. {
  45. m_ObjRefCount = 1;
  46. g_DllRefCount++;
  47. }
  48.  
  49. /**************************************************************************
  50.  
  51.    CClassFactory::~CClassFactory
  52.  
  53. **************************************************************************/
  54.  
  55. CClassFactory::~CClassFactory()
  56. {
  57. g_DllRefCount--;
  58. }
  59.  
  60. /**************************************************************************
  61.  
  62.    CClassFactory::QueryInterface
  63.  
  64. **************************************************************************/
  65.  
  66. STDMETHODIMP CClassFactory::QueryInterface(REFIID riid, LPVOID *ppReturn)
  67. {
  68. *ppReturn = NULL;
  69.  
  70. if(IsEqualIID(riid, IID_IUnknown))
  71.    {
  72.    *ppReturn = this;
  73.    }
  74.    
  75. else if(IsEqualIID(riid, IID_IClassFactory))
  76.    {
  77.    *ppReturn = (IClassFactory*)this;
  78.    }   
  79.  
  80. if(*ppReturn)
  81.    {
  82.    (*(LPUNKNOWN*)ppReturn)->AddRef();
  83.    return S_OK;
  84.    }
  85.  
  86. return E_NOINTERFACE;
  87. }                                             
  88.  
  89. /**************************************************************************
  90.  
  91.    CClassFactory::AddRef
  92.  
  93. **************************************************************************/
  94.  
  95. STDMETHODIMP_(DWORD) CClassFactory::AddRef()
  96. {
  97. return ++m_ObjRefCount;
  98. }
  99.  
  100.  
  101. /**************************************************************************
  102.  
  103.    CClassFactory::Release
  104.  
  105. **************************************************************************/
  106.  
  107. STDMETHODIMP_(DWORD) CClassFactory::Release()
  108. {
  109. if(--m_ObjRefCount == 0)
  110.    {
  111.    delete this;
  112.    return 0;
  113.    }
  114.    
  115. return m_ObjRefCount;
  116. }
  117.  
  118. /**************************************************************************
  119.  
  120.    CClassFactory::CreateInstance
  121.  
  122. **************************************************************************/
  123.  
  124. STDMETHODIMP CClassFactory::CreateInstance(  LPUNKNOWN pUnknown, 
  125.                                              REFIID riid, 
  126.                                              LPVOID *ppObject)
  127. {
  128. *ppObject = NULL;
  129.  
  130. if(pUnknown != NULL)
  131.    return CLASS_E_NOAGGREGATION;
  132.  
  133. //add implementation specific code here
  134.  
  135. CShellFolder *pShellFolder = new CShellFolder(NULL, NULL);
  136. if(NULL == pShellFolder)
  137.    return E_OUTOFMEMORY;
  138.   
  139. //get the QueryInterface return for our return value
  140. HRESULT hResult = pShellFolder->QueryInterface(riid, ppObject);
  141.  
  142. //call Release to decement the ref count
  143. pShellFolder->Release();
  144.  
  145. //return the result from QueryInterface
  146. return hResult;
  147. }
  148.  
  149. /**************************************************************************
  150.  
  151.    CClassFactory::LockServer
  152.  
  153. **************************************************************************/
  154.  
  155. STDMETHODIMP CClassFactory::LockServer(BOOL)
  156. {
  157. return E_NOTIMPL;
  158. }
  159.  
  160.