Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

122 lines
2.9 KiB

////////////////////////////////////////////////////////////////////////
//
// Factory.cpp
//
// Module: WMI high performance provider sample code
//
// This is a standard class factory implementation for the CHiPerfProvider
// object.
//
// History:
// a-dcrews 12-Jan-99 Created
//
//
// Copyright (c) 1999-2001 Microsoft Corporation
//
////////////////////////////////////////////////////////////////////////
#include "precomp.h"
#include "Provider.h"
#include "Factory.h"
extern long g_lObjects;
extern long g_lLocks;
//////////////////////////////////////////////////////////////
//
//
// CClassFactory
//
//
//////////////////////////////////////////////////////////////
STDMETHODIMP CClassFactory::QueryInterface(REFIID riid, void** ppv)
//////////////////////////////////////////////////////////////
//
// Standard QueryInterface
//
// Parameters:
// riid - the ID of the requested interface
// ppv - a pointer to the interface pointer
//
//////////////////////////////////////////////////////////////
{
if (NULL == ppv) return E_POINTER;
if(riid == IID_IUnknown)
*ppv = (LPVOID)(IUnknown*)this;
else if(riid == IID_IClassFactory)
*ppv = (LPVOID)(IClassFactory*)this;
else
{
*ppv = NULL;
return E_NOINTERFACE;
}
((IUnknown*)*ppv)->AddRef();
return S_OK;
}
STDMETHODIMP_(ULONG) CClassFactory::AddRef()
{
return InterlockedIncrement(&m_lRef);
}
STDMETHODIMP_(ULONG) CClassFactory::Release()
{
long lRef = InterlockedDecrement(&m_lRef);
if(lRef == 0) delete this;
return lRef;
}
STDMETHODIMP CClassFactory::CreateInstance(
/* [in] */ IUnknown* pUnknownOuter,
/* [in] */ REFIID iid,
/* [out] */ LPVOID *ppv)
//////////////////////////////////////////////////////////////
//
// Standard COM CreateInstance
//
//////////////////////////////////////////////////////////////
{
HRESULT hRes;
CHiPerfProvider *pProvider = NULL;
*ppv = NULL;
// We do not support aggregation
if (pUnknownOuter) return CLASS_E_NOAGGREGATION;
// Create the provider object
pProvider = new CHiPerfProvider;
if (NULL == pProvider) return E_OUTOFMEMORY;
// Retrieve the requested interface
// ================================
hRes = pProvider->QueryInterface(iid, ppv);
if (FAILED(hRes))
{
delete pProvider;
return hRes;
}
return S_OK;
}
STDMETHODIMP CClassFactory::LockServer(
/* [in] */ BOOL bLock)
//////////////////////////////////////////////////////////////
//
// Standard COM LockServer
//
//////////////////////////////////////////////////////////////
{
if (bLock)
InterlockedIncrement(&g_lLocks);
else
InterlockedDecrement(&g_lLocks);
return S_OK;
}