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 Microsoft Corporation.  All Rights Reserved.
  7. **************************************************************************/
  8. /**************************************************************************
  9.    File:          ClsFact.cpp
  10.    
  11.    Description:   CClassFactory implementation
  12. **************************************************************************/
  13. /**************************************************************************
  14.    #include statements
  15. **************************************************************************/
  16. #include "ClsFact.h"
  17. /**************************************************************************
  18.    global variables
  19. **************************************************************************/
  20. extern DWORD   g_DllRefCount;
  21. /**************************************************************************
  22.    CClassFactory::CClassFactory
  23. **************************************************************************/
  24. CClassFactory::CClassFactory()
  25. {
  26. OutputDebugString(TEXT("CClassFactory's constructorn"));
  27. m_ObjRefCount = 0;
  28. }
  29. /**************************************************************************
  30.    CClassFactory::~CClassFactory
  31. **************************************************************************/
  32. CClassFactory::~CClassFactory()
  33. {
  34. OutputDebugString(TEXT("CClassFactory's destructorn"));
  35. }
  36. /**************************************************************************
  37.    CClassFactory::QueryInterface
  38. **************************************************************************/
  39. STDMETHODIMP CClassFactory::QueryInterface(  REFIID riid, 
  40.                                              LPVOID *ppReturn)
  41. {
  42. OutputDebugString(TEXT("CClassFactory::QueryInterfacen"));
  43. if(IsEqualIID(riid, IID_IUnknown))
  44.    {
  45.    *ppReturn = (LPUNKNOWN)(LPCLASSFACTORY)this;
  46.    m_ObjRefCount++;
  47.    return ResultFromScode(S_OK);
  48.    }
  49.    
  50. if(IsEqualIID(riid, IID_IClassFactory))
  51.    {
  52.    *ppReturn = (LPCLASSFACTORY)this;
  53.    m_ObjRefCount++;
  54.    return ResultFromScode(S_OK);
  55.    }   
  56. *ppReturn = NULL;
  57. return ResultFromScode(E_NOINTERFACE);
  58. }                                             
  59. /**************************************************************************
  60.    CClassFactory::AddRef
  61. **************************************************************************/
  62. STDMETHODIMP_(DWORD) CClassFactory::AddRef()
  63. {
  64. OutputDebugString(TEXT("CClassFactory::AddRefn"));
  65. return ++m_ObjRefCount;
  66. }
  67. /**************************************************************************
  68.    CClassFactory::Release
  69. **************************************************************************/
  70. STDMETHODIMP_(DWORD) CClassFactory::Release()
  71. {
  72. TCHAR szText[MAX_PATH];
  73. wsprintf(szText, TEXT("CClassFactory::Release - ref count will be %dn"), m_ObjRefCount - 1);
  74. OutputDebugString(szText);
  75. if(--m_ObjRefCount == 0)
  76.    delete this;
  77.    
  78. return m_ObjRefCount;
  79. }
  80. /**************************************************************************
  81.    CClassFactory::CreateInstance
  82. **************************************************************************/
  83. STDMETHODIMP CClassFactory::CreateInstance(  LPUNKNOWN pUnknown, 
  84.                                              REFIID riid, 
  85.                                              LPVOID *ppObject)
  86. {
  87. OutputDebugString(TEXT("CClassFactory::CreateInstancen"));
  88. *ppObject = NULL;
  89. if(pUnknown != NULL)
  90.    return ResultFromScode(CLASS_E_NOAGGREGATION);
  91. COleDocument *pOleDoc = new COleDocument;
  92. if(NULL == pOleDoc)
  93.    return ResultFromScode(E_OUTOFMEMORY);
  94.   
  95. //get the QueryInterface return for our return value
  96. HRESULT hr = pOleDoc->QueryInterface(riid, ppObject);
  97. //return the result from QueryInterface
  98. return hr;
  99. }
  100. /**************************************************************************
  101.    CClassFactory::LockServer
  102. **************************************************************************/
  103. STDMETHODIMP CClassFactory::LockServer(BOOL fLock)
  104. {
  105. OutputDebugString(TEXT("CClassFactory::LockServer - "));
  106. if(fLock)
  107.    {
  108.    OutputDebugString(TEXT("Lockn"));
  109.    g_DllRefCount++;
  110.    }
  111. else
  112.    {
  113.    OutputDebugString(TEXT("Unlockn"));
  114.    g_DllRefCount--;
  115.    }
  116. return S_OK;
  117. }