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

Windows编程

开发平台:

Visual C++

  1. /*
  2.  * ICLASSF.CPP
  3.  * Patron Chapter 24
  4.  *
  5.  * Implementation of an IClassFactory interface for Patron to
  6.  * enable linking to its embedded objects.
  7.  *
  8.  * Copyright (c)1993-1995 Microsoft Corporation, All Rights Reserved
  9.  *
  10.  * Kraig Brockschmidt, Microsoft
  11.  * Internet  :  kraigb@microsoft.com
  12.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  13.  */
  14. #include "patron.h"
  15. /*
  16.  * CLinkClassFactory::CLinkClassFactory
  17.  * CLinkClassFactory::~CLinkClassFactory
  18.  *
  19.  * Constructor Parameters:
  20.  *  pFR             PCLinkFrame that can create documents.
  21.  */
  22. CLinkClassFactory::CLinkClassFactory(PCPatronFrame pFR)
  23.     {
  24.     m_cRef=0L;
  25.     m_pFR=pFR;
  26.     return;
  27.     }
  28. CLinkClassFactory::~CLinkClassFactory(void)
  29.     {
  30.     return;
  31.     }
  32. /*
  33.  * CLinkClassFactory::QueryInterface
  34.  * CLinkClassFactory::AddRef
  35.  * CLinkClassFactory::Release
  36.  */
  37. STDMETHODIMP CLinkClassFactory::QueryInterface(REFIID riid
  38.     , PPVOID ppv)
  39.     {
  40.     *ppv=NULL;
  41.     if (IID_IUnknown==riid || IID_IClassFactory==riid)
  42.         *ppv=this;
  43.     if (NULL!=*ppv)
  44.         {
  45.         ((LPUNKNOWN)*ppv)->AddRef();
  46.         return NOERROR;
  47.         }
  48.     return ResultFromScode(E_NOINTERFACE);
  49.     }
  50. STDMETHODIMP_(ULONG) CLinkClassFactory::AddRef(void)
  51.     {
  52.     return ++m_cRef;
  53.     }
  54. STDMETHODIMP_(ULONG) CLinkClassFactory::Release(void)
  55.     {
  56.     if (0!=--m_cRef)
  57.         return m_cRef;
  58.     delete this;
  59.     return 0;
  60.     }
  61. /*
  62.  * CLinkClassFactory::CreateInstance
  63.  *
  64.  * Purpose:
  65.  *  Instantiates an object to resolve a link to an embedding.
  66.  */
  67. STDMETHODIMP CLinkClassFactory::CreateInstance(LPUNKNOWN pUnkOuter
  68.     , REFIID riid, PPVOID ppvObj)
  69.     {
  70.     PCPatronDoc         pDoc;
  71.     HRESULT             hr;
  72.     *ppvObj=NULL;
  73.     hr=ResultFromScode(E_OUTOFMEMORY);
  74.     //We don't support aggregation
  75.     if (NULL!=pUnkOuter)
  76.         return ResultFromScode(CLASS_E_NOAGGREGATION);
  77.     //Try creating a new document, which creates the object.
  78.     pDoc=(PCPatronDoc)m_pFR->m_pCL->NewDocument(TRUE);
  79.     //ObjectDestroyed has already been called.
  80.     if (NULL==pDoc)
  81.         {
  82.         g_cObj++;
  83.         ObjectDestroyed();
  84.         return hr;
  85.         }
  86.     /*
  87.      * We don't want to do any file initialization here because we
  88.      * want to wait for IPersistFile calls.  If we called Load(NULL)
  89.      * we'd create storages and whatnot that we don't want in this
  90.      * case.
  91.      */
  92.     hr=pDoc->QueryInterface(riid, ppvObj);
  93.     if (FAILED(hr))
  94.         {
  95.         m_pFR->m_pCL->CloseDocument(pDoc);
  96.         g_cObj++;
  97.         ObjectDestroyed();
  98.         return hr;
  99.         }
  100.     m_pFR->m_pDocCreated=pDoc;
  101.     return NOERROR;
  102.     }
  103. /*
  104.  * CLinkClassFactory::LockServer
  105.  *
  106.  * Purpose:
  107.  *  Provides control of the application in memory.
  108.  */
  109. STDMETHODIMP CLinkClassFactory::LockServer(BOOL fLock)
  110.     {
  111.     if (fLock)
  112.         g_cLock++;
  113.     else
  114.         {
  115.         g_cLock--;
  116.         g_cObj++;
  117.         ObjectDestroyed();
  118.         }
  119.     return NOERROR;
  120.     }