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

Windows编程

开发平台:

Visual C++

  1. /*************************************************************************
  2. **
  3. **  This is a part of the Microsoft Source Code Samples.
  4. **
  5. **  Copyright (C) 1992-1997 Microsoft Corporation. All rights reserved.
  6. **
  7. **  This source code is only intended as a supplement to Microsoft Development
  8. **  Tools and/or WinHelp documentation.  See these sources for detailed
  9. **  information regarding the Microsoft samples programs.
  10. **
  11. **  OLE Simple InProc Automation Object.
  12. **
  13. **  Applicationcf.cpp
  14. **
  15. **  CApplicationCF (class factory) implementation
  16. **
  17. **  Written by Microsoft Product Support Services, Windows Developer Support
  18. **
  19. *************************************************************************/
  20. #include <windows.h>
  21. #include <windowsx.h>
  22. #ifdef WIN16   
  23.   #include <ole2.h>
  24.   #include <compobj.h>    
  25.   #include <dispatch.h> 
  26.   #include <variant.h>
  27.   #include <olenls.h>  
  28. #endif      
  29. #include "lines.h" 
  30. CApplicationCF::CApplicationCF(void)
  31. {    
  32.     m_cRef = 0; 
  33. }
  34. /*
  35.  * CApplicationCF::QueryInterface, AddRef, Release
  36.  *
  37.  * Purpose:
  38.  *  Implements IUnknown::QueryInterface, AddRef, Release
  39.  *
  40.  */
  41. STDMETHODIMP
  42. CApplicationCF::QueryInterface(REFIID iid, void FAR* FAR* ppv) 
  43. {   
  44.     *ppv = NULL;
  45.     
  46.     if (iid == IID_IUnknown || iid == IID_IClassFactory)
  47.         *ppv = this;
  48.     else 
  49.         return E_NOINTERFACE; 
  50.     AddRef();
  51.     return NOERROR;    
  52. }
  53. STDMETHODIMP_(ULONG)
  54. CApplicationCF::AddRef(void)
  55. {
  56.     return ++m_cRef;
  57. }
  58. STDMETHODIMP_(ULONG)
  59. CApplicationCF::Release(void)
  60. {   
  61.     if(--m_cRef == 0)
  62.     {
  63.         delete this;
  64.         return 0;
  65.     }
  66.     return m_cRef;
  67. }
  68. /*
  69.  * CApplicationCF::CreateInstance, LockServer
  70.  *
  71.  * Purpose:
  72.  *  Implements IClassFactory::CreateInstance, LockServer
  73.  *
  74.  */
  75. STDMETHODIMP
  76. CApplicationCF::CreateInstance(IUnknown FAR* punkOuter,
  77.                          REFIID riid,
  78.                          void FAR* FAR* ppv)
  79. {
  80.     HRESULT hr;
  81.     
  82.     *ppv = NULL;
  83.     
  84.     // This implementation does'nt allow aggregation
  85.     if (punkOuter)
  86.         return CLASS_E_NOAGGREGATION;
  87.     
  88.     // This is REGCLS_SINGLEUSE class factory, so CreateInstance will be
  89.     // called atmost once. An application objects has a REGCLS_SINGLEUSE class
  90.     // factory. The global application object has already been created when 
  91.     // CreateInstance is called. A REGCLS_MULTIPLEUSE class factory's 
  92.     // CreateInstance would be called multiple times and would create a new 
  93.     // object each time. An MDI application would have a REGCLS_MULTIPLEUSE 
  94.     // class factory for it's document objects.             
  95.     hr = g_pApplication->QueryInterface(riid, ppv);
  96.     if (FAILED(hr)) 
  97.     {
  98.         g_pApplication->Quit();
  99.         return hr;
  100.     }   
  101.     return NOERROR;
  102. }
  103. STDMETHODIMP
  104. CApplicationCF::LockServer(BOOL fLock)
  105. {
  106.     CoLockObjectExternal(g_pApplication, fLock, TRUE); 
  107.     return NOERROR;     
  108. }