119 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			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;
 | |
| }
 | |
| 
 | 
