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
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;
|
|
}
|