home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / com / activedocument / doserver / clsfact.cpp next >
C/C++ Source or Header  |  1997-05-28  |  5KB  |  167 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:   CClassFactory implementation
  15.  
  16. **************************************************************************/
  17.  
  18. /**************************************************************************
  19.    #include statements
  20. **************************************************************************/
  21.  
  22. #include "ClsFact.h"
  23.  
  24. /**************************************************************************
  25.    global variables
  26. **************************************************************************/
  27.  
  28. extern DWORD   g_DllRefCount;
  29.  
  30. /**************************************************************************
  31.  
  32.    CClassFactory::CClassFactory
  33.  
  34. **************************************************************************/
  35.  
  36. CClassFactory::CClassFactory()
  37. {
  38. OutputDebugString(TEXT("CClassFactory's constructor\n"));
  39.  
  40. m_ObjRefCount = 0;
  41. }
  42.  
  43. /**************************************************************************
  44.  
  45.    CClassFactory::~CClassFactory
  46.  
  47. **************************************************************************/
  48.  
  49. CClassFactory::~CClassFactory()
  50. {
  51. OutputDebugString(TEXT("CClassFactory's destructor\n"));
  52. }
  53.  
  54. /**************************************************************************
  55.  
  56.    CClassFactory::QueryInterface
  57.  
  58. **************************************************************************/
  59.  
  60. STDMETHODIMP CClassFactory::QueryInterface(  REFIID riid, 
  61.                                              LPVOID *ppReturn)
  62. {
  63. OutputDebugString(TEXT("CClassFactory::QueryInterface\n"));
  64.  
  65. if(IsEqualIID(riid, IID_IUnknown))
  66.    {
  67.    *ppReturn = (LPUNKNOWN)(LPCLASSFACTORY)this;
  68.    m_ObjRefCount++;
  69.    return ResultFromScode(S_OK);
  70.    }
  71.    
  72. if(IsEqualIID(riid, IID_IClassFactory))
  73.    {
  74.    *ppReturn = (LPCLASSFACTORY)this;
  75.    m_ObjRefCount++;
  76.    return ResultFromScode(S_OK);
  77.    }   
  78.  
  79. *ppReturn = NULL;
  80. return ResultFromScode(E_NOINTERFACE);
  81. }                                             
  82.  
  83. /**************************************************************************
  84.  
  85.    CClassFactory::AddRef
  86.  
  87. **************************************************************************/
  88.  
  89. STDMETHODIMP_(DWORD) CClassFactory::AddRef()
  90. {
  91. OutputDebugString(TEXT("CClassFactory::AddRef\n"));
  92.  
  93. return ++m_ObjRefCount;
  94. }
  95.  
  96.  
  97. /**************************************************************************
  98.  
  99.    CClassFactory::Release
  100.  
  101. **************************************************************************/
  102.  
  103. STDMETHODIMP_(DWORD) CClassFactory::Release()
  104. {
  105. TCHAR szText[MAX_PATH];
  106. wsprintf(szText, TEXT("CClassFactory::Release - ref count will be %d\n"), m_ObjRefCount - 1);
  107. OutputDebugString(szText);
  108.  
  109. if(--m_ObjRefCount == 0)
  110.    delete this;
  111.    
  112. return m_ObjRefCount;
  113. }
  114.  
  115. /**************************************************************************
  116.  
  117.    CClassFactory::CreateInstance
  118.  
  119. **************************************************************************/
  120.  
  121. STDMETHODIMP CClassFactory::CreateInstance(  LPUNKNOWN pUnknown, 
  122.                                              REFIID riid, 
  123.                                              LPVOID *ppObject)
  124. {
  125. OutputDebugString(TEXT("CClassFactory::CreateInstance\n"));
  126.  
  127. *ppObject = NULL;
  128.  
  129. if(pUnknown != NULL)
  130.    return ResultFromScode(CLASS_E_NOAGGREGATION);
  131.  
  132. COleDocument *pOleDoc = new COleDocument;
  133. if(NULL == pOleDoc)
  134.    return ResultFromScode(E_OUTOFMEMORY);
  135.   
  136. //get the QueryInterface return for our return value
  137. HRESULT hr = pOleDoc->QueryInterface(riid, ppObject);
  138.  
  139. //return the result from QueryInterface
  140. return hr;
  141. }
  142.  
  143. /**************************************************************************
  144.  
  145.    CClassFactory::LockServer
  146.  
  147. **************************************************************************/
  148.  
  149. STDMETHODIMP CClassFactory::LockServer(BOOL fLock)
  150. {
  151. OutputDebugString(TEXT("CClassFactory::LockServer - "));
  152.  
  153. if(fLock)
  154.    {
  155.    OutputDebugString(TEXT("Lock\n"));
  156.    g_DllRefCount++;
  157.    }
  158. else
  159.    {
  160.    OutputDebugString(TEXT("Unlock\n"));
  161.    g_DllRefCount--;
  162.    }
  163.  
  164. return S_OK;
  165. }
  166.  
  167.