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

Windows编程

开发平台:

Visual C++

  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.    Copyright 1997 - 1998 Microsoft Corporation.  All Rights Reserved.
  7. **************************************************************************/
  8. /**************************************************************************
  9.    File:          ClsFact.cpp
  10.    
  11.    Description:   Implements CClassFactory.
  12. **************************************************************************/
  13. /**************************************************************************
  14.    #include statements
  15. **************************************************************************/
  16. #include "ClsFact.h"
  17. #include "Guid.h"
  18. /**************************************************************************
  19.    private function prototypes
  20. **************************************************************************/
  21. /**************************************************************************
  22.    global variables
  23. **************************************************************************/
  24. ///////////////////////////////////////////////////////////////////////////
  25. //
  26. // IClassFactory implementation
  27. //
  28. /**************************************************************************
  29.    CClassFactory::CClassFactory
  30. **************************************************************************/
  31. CClassFactory::CClassFactory(CLSID clsid)
  32. {
  33. m_clsidObject = clsid;
  34. m_ObjRefCount = 1;
  35. g_DllRefCount++;
  36. }
  37. /**************************************************************************
  38.    CClassFactory::~CClassFactory
  39. **************************************************************************/
  40. CClassFactory::~CClassFactory()
  41. {
  42. g_DllRefCount--;
  43. }
  44. /**************************************************************************
  45.    CClassFactory::QueryInterface
  46. **************************************************************************/
  47. STDMETHODIMP CClassFactory::QueryInterface(REFIID riid, LPVOID *ppReturn)
  48. {
  49. *ppReturn = NULL;
  50. if(IsEqualIID(riid, IID_IUnknown))
  51.    {
  52.    *ppReturn = this;
  53.    }
  54.    
  55. else if(IsEqualIID(riid, IID_IClassFactory))
  56.    {
  57.    *ppReturn = (IClassFactory*)this;
  58.    }   
  59. if(*ppReturn)
  60.    {
  61.    (*(LPUNKNOWN*)ppReturn)->AddRef();
  62.    return S_OK;
  63.    }
  64. return E_NOINTERFACE;
  65. }                                             
  66. /**************************************************************************
  67.    CClassFactory::AddRef
  68. **************************************************************************/
  69. STDMETHODIMP_(DWORD) CClassFactory::AddRef()
  70. {
  71. return ++m_ObjRefCount;
  72. }
  73. /**************************************************************************
  74.    CClassFactory::Release
  75. **************************************************************************/
  76. STDMETHODIMP_(DWORD) CClassFactory::Release()
  77. {
  78. if(--m_ObjRefCount == 0)
  79.    {
  80.    delete this;
  81.    return 0;
  82.    }
  83.    
  84. return m_ObjRefCount;
  85. }
  86. /**************************************************************************
  87.    CClassFactory::CreateInstance
  88. **************************************************************************/
  89. STDMETHODIMP CClassFactory::CreateInstance(  LPUNKNOWN pUnknown, 
  90.                                              REFIID riid, 
  91.                                              LPVOID *ppObject)
  92. {
  93. HRESULT  hResult = E_FAIL;
  94. LPVOID   pTemp = NULL;
  95. *ppObject = NULL;
  96. if(pUnknown != NULL)
  97.    return CLASS_E_NOAGGREGATION;
  98. //create the proper object
  99. if(IsEqualCLSID(m_clsidObject, CLSID_SampleDeskBand))
  100.    {
  101.    CDeskBand *pDeskBand = new CDeskBand();
  102.    if(NULL == pDeskBand)
  103.       return E_OUTOFMEMORY;
  104.    
  105.    pTemp = pDeskBand;
  106.    }
  107.   
  108. if(IsEqualCLSID(m_clsidObject, CLSID_SampleExplorerBar))
  109.    {
  110.    CExplorerBar *pExplorerBar = new CExplorerBar();
  111.    if(NULL == pExplorerBar)
  112.       return E_OUTOFMEMORY;
  113.    
  114.    pTemp = pExplorerBar;
  115.    }
  116.   
  117. if(IsEqualCLSID(m_clsidObject, CLSID_SampleCommBand))
  118.    {
  119.    CCommBand *pCommBand = new CCommBand();
  120.    if(NULL == pCommBand)
  121.       return E_OUTOFMEMORY;
  122.    
  123.    pTemp = pCommBand;
  124.    }
  125.   
  126. if(pTemp)
  127.    {
  128.    //get the QueryInterface return for our return value
  129.    hResult = ((LPUNKNOWN)pTemp)->QueryInterface(riid, ppObject);
  130.    //call Release to decement the ref count
  131.    ((LPUNKNOWN)pTemp)->Release();
  132.    }
  133. return hResult;
  134. }
  135. /**************************************************************************
  136.    CClassFactory::LockServer
  137. **************************************************************************/
  138. STDMETHODIMP CClassFactory::LockServer(BOOL)
  139. {
  140. return E_NOTIMPL;
  141. }