CLSFACT.CPP
资源名称:MSDN_VC98.zip [点击查看]
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:
Windows编程
开发平台:
Visual C++
- /**************************************************************************
- THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
- ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
- THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
- PARTICULAR PURPOSE.
- Copyright 1997 - 1998 Microsoft Corporation. All Rights Reserved.
- **************************************************************************/
- /**************************************************************************
- File: ClsFact.cpp
- Description: Implements CClassFactory.
- **************************************************************************/
- /**************************************************************************
- #include statements
- **************************************************************************/
- #include "ClsFact.h"
- #include "Guid.h"
- /**************************************************************************
- private function prototypes
- **************************************************************************/
- /**************************************************************************
- global variables
- **************************************************************************/
- ///////////////////////////////////////////////////////////////////////////
- //
- // IClassFactory implementation
- //
- /**************************************************************************
- CClassFactory::CClassFactory
- **************************************************************************/
- CClassFactory::CClassFactory(CLSID clsid)
- {
- m_clsidObject = clsid;
- m_ObjRefCount = 1;
- g_DllRefCount++;
- }
- /**************************************************************************
- CClassFactory::~CClassFactory
- **************************************************************************/
- CClassFactory::~CClassFactory()
- {
- g_DllRefCount--;
- }
- /**************************************************************************
- CClassFactory::QueryInterface
- **************************************************************************/
- STDMETHODIMP CClassFactory::QueryInterface(REFIID riid, LPVOID *ppReturn)
- {
- *ppReturn = NULL;
- if(IsEqualIID(riid, IID_IUnknown))
- {
- *ppReturn = this;
- }
- else if(IsEqualIID(riid, IID_IClassFactory))
- {
- *ppReturn = (IClassFactory*)this;
- }
- if(*ppReturn)
- {
- (*(LPUNKNOWN*)ppReturn)->AddRef();
- return S_OK;
- }
- return E_NOINTERFACE;
- }
- /**************************************************************************
- CClassFactory::AddRef
- **************************************************************************/
- STDMETHODIMP_(DWORD) CClassFactory::AddRef()
- {
- return ++m_ObjRefCount;
- }
- /**************************************************************************
- CClassFactory::Release
- **************************************************************************/
- STDMETHODIMP_(DWORD) CClassFactory::Release()
- {
- if(--m_ObjRefCount == 0)
- {
- delete this;
- return 0;
- }
- return m_ObjRefCount;
- }
- /**************************************************************************
- CClassFactory::CreateInstance
- **************************************************************************/
- STDMETHODIMP CClassFactory::CreateInstance( LPUNKNOWN pUnknown,
- REFIID riid,
- LPVOID *ppObject)
- {
- HRESULT hResult = E_FAIL;
- LPVOID pTemp = NULL;
- *ppObject = NULL;
- if(pUnknown != NULL)
- return CLASS_E_NOAGGREGATION;
- //create the proper object
- if(IsEqualCLSID(m_clsidObject, CLSID_SampleDeskBand))
- {
- CDeskBand *pDeskBand = new CDeskBand();
- if(NULL == pDeskBand)
- return E_OUTOFMEMORY;
- pTemp = pDeskBand;
- }
- if(IsEqualCLSID(m_clsidObject, CLSID_SampleExplorerBar))
- {
- CExplorerBar *pExplorerBar = new CExplorerBar();
- if(NULL == pExplorerBar)
- return E_OUTOFMEMORY;
- pTemp = pExplorerBar;
- }
- if(IsEqualCLSID(m_clsidObject, CLSID_SampleCommBand))
- {
- CCommBand *pCommBand = new CCommBand();
- if(NULL == pCommBand)
- return E_OUTOFMEMORY;
- pTemp = pCommBand;
- }
- if(pTemp)
- {
- //get the QueryInterface return for our return value
- hResult = ((LPUNKNOWN)pTemp)->QueryInterface(riid, ppObject);
- //call Release to decement the ref count
- ((LPUNKNOWN)pTemp)->Release();
- }
- return hResult;
- }
- /**************************************************************************
- CClassFactory::LockServer
- **************************************************************************/
- STDMETHODIMP CClassFactory::LockServer(BOOL)
- {
- return E_NOTIMPL;
- }