home *** CD-ROM | disk | FTP | other *** search
/ Tricks of the Windows Gam…ming Gurus (2nd Edition) / Disc2.iso / msdn_vcb / samples / vc98 / sdk / dbmsg / mapi / simple.frm / iclassf.cpp < prev    next >
C/C++ Source or Header  |  1996-04-11  |  3KB  |  163 lines

  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  FILE:           ICLASSF.CPP
  4. //
  5. //  DESCRIPTION:    Sample form's class factory
  6. //
  7. //
  8. //  Copyright (c) 1994, Microsoft Corporation.
  9. //  All rights reserved.
  10. //
  11. //--
  12.  
  13. #include "precomp.h"
  14.  
  15. CClassFactory           ClassFactory;
  16.  
  17. HWND  CClassFactory::ms_hWndMain;
  18. ULONG CClassFactory::ms_cLocks= 0;
  19. ULONG CClassFactory::ms_cObjs = 0;
  20.  
  21.  
  22. ///////////////////////////////////////////////////////////////////////////////
  23. //
  24. //  Constructor and destructor
  25.  
  26. CClassFactory::CClassFactory()
  27. {
  28.     m_cRef   = 1;
  29. }
  30.  
  31. CClassFactory::~CClassFactory (void)
  32. {
  33.     ASSERT(m_cRef == 1);
  34. }
  35.  
  36.  
  37. ///////////////////////////////////////////////////////////////////////////////
  38. //
  39. //  IUnknown methods
  40.  
  41. STDMETHODIMP CClassFactory::QueryInterface(REFIID riid, void ** ppvObj)
  42. {
  43.  
  44.     if ((IID_IClassFactory == riid) || (IID_IUnknown == riid))
  45.     {
  46.         *ppvObj = (IClassFactory*) this;
  47.         AddRef ();
  48.         return NOERROR;
  49.     }
  50.  
  51.     *ppvObj = 0;
  52.  
  53.     return ResultFromScode (E_NOINTERFACE);
  54. }
  55.  
  56.  
  57. STDMETHODIMP_ (ULONG)CClassFactory::AddRef()
  58. {
  59.     return ++ m_cRef;
  60. }
  61.  
  62. STDMETHODIMP_(ULONG) CClassFactory::Release()
  63. {
  64.     ULONG cRef = -- m_cRef;
  65.  
  66.     //We quit when cRef == 1 (as oppossed to == 0) because OLE
  67.     //will not release its reference until after we call
  68.     // CoRevokeClassObject(). So if cRef==1 we know that only
  69.     //OLE has a reference to as, and it's time to go...
  70.     if ((cRef == 1) && (ms_cLocks == 0) && (ms_cObjs == 0))
  71.     {
  72.         if (ms_hWndMain)
  73.         {
  74.             PostMessage (ms_hWndMain, WM_CLOSE, 0, 0L);
  75.         }
  76.     }
  77.  
  78.     return cRef;
  79. }
  80.  
  81.  
  82. ///////////////////////////////////////////////////////////////////////////////
  83. //
  84.  
  85. STDMETHODIMP CClassFactory::CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid,
  86.                                            LPVOID FAR* ppvObject)
  87. {
  88.     HRESULT     hr  = ResultFromScode (E_NOINTERFACE);
  89.     CBaseForm * pbf = NULL;
  90.  
  91.     if (!ppvObject)
  92.         return ResultFromScode (E_INVALIDARG);
  93.     
  94.     *ppvObject = 0;
  95.  
  96.     //
  97.     //  We don't support aggregation.
  98.  
  99.     if (pUnkOuter != NULL)
  100.         return  ResultFromScode (CLASS_E_NOAGGREGATION);
  101.  
  102.     pbf = new CBaseForm (this);
  103.  
  104.     if(NULL == pbf)
  105.         return ResultFromScode(E_OUTOFMEMORY);
  106.  
  107.     hr = pbf -> QueryInterface (riid, ppvObject);
  108.     if (HR_FAILED(hr))
  109.         goto err;
  110.  
  111.     ms_cObjs ++;
  112.  
  113.     hr = hrSuccess;
  114.  
  115. err:
  116.     if (pbf)
  117.     {
  118.         pbf -> Release ();
  119.     }
  120.     return hr;
  121. }
  122.  
  123.  
  124. ///////////////////////////////////////////////////////////////////////////////
  125. //
  126.  
  127. STDMETHODIMP CClassFactory::LockServer(BOOL fLock)
  128. {
  129.     if (fLock)
  130.     {
  131.         ++ ms_cLocks;
  132.     }
  133.     else
  134.     {
  135.         ASSERT (ms_cLocks > 0);
  136.         -- ms_cLocks;
  137.  
  138.         if ((ms_cLocks == 0) && (ms_cObjs == 0))
  139.         {
  140.             if (ms_hWndMain)
  141.             {
  142.                 PostMessage (ms_hWndMain, WM_CLOSE, 0, 0L);
  143.             }
  144.         }
  145.     }
  146.     return NOERROR;
  147. }
  148.  
  149.  
  150. void FAR PASCAL CClassFactory::ObjDestroyedCallback (void)
  151. {
  152.     ASSERT (ms_cObjs > 0);
  153.     ms_cObjs --;
  154.  
  155.     if ((ms_cLocks == 0) && (ms_cObjs == 0))
  156.     {
  157.         if (ms_hWndMain)
  158.         {
  159.             PostMessage (ms_hWndMain, WM_CLOSE, 0, 0L);
  160.         }
  161.     }
  162. }
  163.