2007-12-10 20:53:52 +00:00

119 lines
3.8 KiB
C++

/***************************************************************************
* CLASSFACTORY.CPP
*
* CDsoFramerClassFactory: The Class Factroy for the control.
*
* Copyright ©1999-2004; Microsoft Corporation. All rights reserved.
* Written by Microsoft Developer Support Office Integration (PSS DSOI)
*
* This code is provided via KB 311765 as a sample. It is not a formal
* product and has not been tested with all containers or servers. Use it
* for educational purposes only. See the EULA.TXT file included in the
* KB download for full terms of use and restrictions.
*
* THIS CODE 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.
*
***************************************************************************/
#include "dsoframer.h"
////////////////////////////////////////////////////////////////////////
// CDsoFramerClassFactory - IClassFactory Implementation
//
// This is a fairly simple CF. We don't provide support for licensing
// in this sample because it is just a sample. If licensing is important
// you should change the class to support IClassFactory2.
//
////////////////////////////////////////////////////////////////////////
// CDsoFramerClassFactory::QueryInterface
//
STDMETHODIMP CDsoFramerClassFactory::QueryInterface(REFIID riid, void** ppv)
{
ODS("CDsoFramerClassFactory::QueryInterface\n");
CHECK_NULL_RETURN(ppv, E_POINTER);
if ((IID_IUnknown == riid) || (IID_IClassFactory == riid))
{
SAFE_SET_INTERFACE(*ppv, (IClassFactory*)this);
return S_OK;
}
*ppv = NULL;
return E_NOINTERFACE;
}
////////////////////////////////////////////////////////////////////////
// CDsoFramerClassFactory::AddRef
//
STDMETHODIMP_(ULONG) CDsoFramerClassFactory::AddRef(void)
{
TRACE1("CDsoFramerClassFactory::AddRef - %d\n", m_cRef+1);
return ++m_cRef;
}
////////////////////////////////////////////////////////////////////////
// CDsoFramerClassFactory::Release
//
STDMETHODIMP_(ULONG) CDsoFramerClassFactory::Release(void)
{
TRACE1("CDsoFramerClassFactory::Release - %d\n", m_cRef-1);
if (0 != --m_cRef) return m_cRef;
ODS("CDsoFramerClassFactory delete\n");
InterlockedDecrement((LPLONG)&v_cLocks);
delete this;
return 0;
}
////////////////////////////////////////////////////////////////////////
// CDsoFramerClassFactory::CreateInstance
//
// Creates an instance of our control.
//
STDMETHODIMP CDsoFramerClassFactory::CreateInstance(LPUNKNOWN punk, REFIID riid, void** ppv)
{
HRESULT hr;
CDsoFramerControl* pocx;
IUnknown* pnkInternal;
ODS("CDsoFramerClassFactory::CreateInstance\n");
CHECK_NULL_RETURN(ppv, E_POINTER); *ppv = NULL;
// Aggregation requires you ask for (internal) IUnknown
if ((punk) && (riid != IID_IUnknown))
return E_INVALIDARG;
// Create a new instance of the control...
pocx = new CDsoFramerControl(punk);
CHECK_NULL_RETURN(pocx, E_OUTOFMEMORY);
// Grab the internal IUnknown to use for the QI (you don't agg in CF:CreateInstance)...
pnkInternal = (IUnknown*)&(pocx->m_xInternalUnknown);
// Initialize the control (windows, etc.) and QI for requested interface...
if (SUCCEEDED(hr = pocx->InitializeNewInstance()) &&
SUCCEEDED(hr = pnkInternal->QueryInterface(riid, ppv)))
{
InterlockedIncrement((LPLONG)&v_cLocks); // on success, bump up the lock count...
}
else {delete pocx; *ppv = NULL;} // else cleanup the object
return hr;
}
////////////////////////////////////////////////////////////////////////
// CDsoFramerClassFactory::LockServer
//
// Keeps the server loaded in memory.
//
STDMETHODIMP CDsoFramerClassFactory::LockServer(BOOL fLock)
{
TRACE1("CDsoFramerClassFactory::LockServer - %d\n", fLock);
if (fLock) InterlockedIncrement((LPLONG)&v_cLocks);
else InterlockedDecrement((LPLONG)&v_cLocks);
return S_OK;
}