200 lines
3.8 KiB
C++
200 lines
3.8 KiB
C++
/*++
|
||
|
||
Copyright (c) 1997 Microsoft Corporation
|
||
|
||
Module Name :
|
||
cofact.cxx
|
||
|
||
Abstract:
|
||
class factory
|
||
|
||
Author:
|
||
|
||
Johnson Apacible (JohnsonA) 02-April-1997
|
||
|
||
|
||
--*/
|
||
|
||
#include "precomp.hxx"
|
||
#define INITGUID
|
||
#undef DEFINE_GUID // Added for NT 5 migration
|
||
|
||
#include "comlog.hxx"
|
||
|
||
ULONG g_dwRefCount = 0;
|
||
|
||
CINETLOGSrvFactory::CINETLOGSrvFactory(
|
||
VOID
|
||
)
|
||
{
|
||
m_dwRefCount=0;
|
||
}
|
||
|
||
CINETLOGSrvFactory::~CINETLOGSrvFactory(
|
||
VOID
|
||
)
|
||
{
|
||
}
|
||
|
||
HRESULT
|
||
CINETLOGSrvFactory::CreateInstance(
|
||
IUnknown *pUnkOuter,
|
||
REFIID riid,
|
||
void ** ppObject
|
||
)
|
||
{
|
||
HRESULT hresReturn = E_NOINTERFACE;
|
||
|
||
if (pUnkOuter != NULL)
|
||
{
|
||
return CLASS_E_NOAGGREGATION;
|
||
}
|
||
|
||
if (m_ClsId == CLSID_InetLogPublic)
|
||
{
|
||
CInetLogPublic *pInetLogPublic = new CInetLogPublic();
|
||
|
||
if( pInetLogPublic == NULL )
|
||
{
|
||
hresReturn = E_OUTOFMEMORY;
|
||
}
|
||
else
|
||
{
|
||
hresReturn = pInetLogPublic->QueryInterface(riid, ppObject);
|
||
|
||
if( FAILED(hresReturn) )
|
||
{
|
||
DBGPRINTF( (DBG_CONTEXT,
|
||
"[CINETLOGSrvFactory::CreateInstance] no I/F\n"));
|
||
delete pInetLogPublic;
|
||
}
|
||
}
|
||
}
|
||
else if (m_ClsId == CLSID_InetLogInformation)
|
||
{
|
||
CInetLogInformation *pInetLogInfo = new CInetLogInformation();
|
||
|
||
if( pInetLogInfo == NULL )
|
||
{
|
||
hresReturn = E_OUTOFMEMORY;
|
||
}
|
||
else
|
||
{
|
||
hresReturn = pInetLogInfo->QueryInterface(riid, ppObject);
|
||
|
||
if( FAILED(hresReturn) )
|
||
{
|
||
DBGPRINTF( (DBG_CONTEXT,
|
||
"[CINETLOGSrvFactory::CreateInstance] no I/F\n"));
|
||
delete pInetLogInfo;
|
||
}
|
||
}
|
||
}
|
||
|
||
return hresReturn;
|
||
}
|
||
|
||
HRESULT
|
||
CINETLOGSrvFactory::LockServer(
|
||
IN BOOL fLock
|
||
)
|
||
{
|
||
if (fLock) {
|
||
InterlockedIncrement((long *)&g_dwRefCount);
|
||
} else {
|
||
InterlockedDecrement((long *)&g_dwRefCount);
|
||
}
|
||
return NO_ERROR;
|
||
}
|
||
|
||
HRESULT
|
||
CINETLOGSrvFactory::QueryInterface(
|
||
REFIID riid,
|
||
void **ppObject
|
||
)
|
||
{
|
||
if (riid==IID_IUnknown || riid == IID_IClassFactory) {
|
||
*ppObject = (IClassFactory *) this;
|
||
}
|
||
else {
|
||
return E_NOINTERFACE;
|
||
}
|
||
|
||
AddRef();
|
||
return NO_ERROR;
|
||
}
|
||
|
||
ULONG
|
||
CINETLOGSrvFactory::AddRef(
|
||
)
|
||
{
|
||
DWORD dwRefCount;
|
||
dwRefCount = InterlockedIncrement((long *)&m_dwRefCount);
|
||
return dwRefCount;
|
||
}
|
||
|
||
ULONG
|
||
CINETLOGSrvFactory::Release()
|
||
{
|
||
DWORD dwRefCount;
|
||
dwRefCount = InterlockedDecrement((long *)&m_dwRefCount);
|
||
if (dwRefCount == 0) {
|
||
delete this;
|
||
}
|
||
return dwRefCount;
|
||
}
|
||
|
||
|
||
|
||
|
||
STDAPI
|
||
DllGetClassObject(
|
||
REFCLSID rclsid,
|
||
REFIID riid,
|
||
void** ppObject)
|
||
{
|
||
*ppObject = NULL;
|
||
|
||
if ((rclsid != CLSID_InetLogInformation) &&
|
||
(rclsid != CLSID_InetLogPublic)
|
||
)
|
||
{
|
||
DBGPRINTF( (DBG_CONTEXT, "[CINETLOGSrvFactory::DllGetClassObject] bad class\n" ) );
|
||
return CLASS_E_CLASSNOTAVAILABLE;
|
||
}
|
||
|
||
CINETLOGSrvFactory *pFactory = new CINETLOGSrvFactory;
|
||
|
||
if( pFactory == NULL )
|
||
{
|
||
return E_OUTOFMEMORY;
|
||
}
|
||
|
||
pFactory->m_ClsId = rclsid;
|
||
|
||
if (FAILED(pFactory->QueryInterface(riid, ppObject)))
|
||
{
|
||
delete pFactory;
|
||
DBGPRINTF( (DBG_CONTEXT, "[CINETLOGSrvFactory::DllGetClassObject] no I/F\n" ) );
|
||
return E_INVALIDARG;
|
||
}
|
||
return NO_ERROR;
|
||
}
|
||
|
||
|
||
HRESULT
|
||
_stdcall
|
||
DllCanUnloadNow(
|
||
VOID
|
||
)
|
||
{
|
||
|
||
if (g_dwRefCount != 0) {
|
||
return S_FALSE;
|
||
} else {
|
||
return S_OK;
|
||
}
|
||
} // DllCanUnloadNow
|
||
|
||
|