Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

236 lines
5.7 KiB

//****************************************************************************
//
// Module: ULS.DLL
// File: classfac.cpp
// Content: This file contains the class factory object.
// History:
// Tue 08-Oct-1996 08:56:46 -by- Viroon Touranachun [viroont]
//
// Copyright (c) Microsoft Corporation 1996-1997
//
//****************************************************************************
#include "ulsp.h"
#include "culs.h"
//****************************************************************************
// Initialize GUIDs (should be done only and at-least once per DLL/EXE)
//****************************************************************************
#define INITGUID
#include <initguid.h>
#include <ilsguid.h>
#include "classfac.h"
//****************************************************************************
// Global Parameters
//****************************************************************************
//
CClassFactory* g_pClassFactory = NULL;
//****************************************************************************
// CClassFactory::CClassFactory (void)
//
// History:
// Tue 08-Oct-1996 09:00:10 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
CClassFactory::
CClassFactory (void)
{
cRef = 0;
return;
}
//****************************************************************************
// STDMETHODIMP
// CClassFactory::QueryInterface (REFIID riid, void **ppv)
//
// History:
// Tue 08-Oct-1996 09:00:18 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CClassFactory::QueryInterface (REFIID riid, void **ppv)
{
if (riid == IID_IClassFactory || riid == IID_IUnknown)
{
*ppv = (IClassFactory *) this;
AddRef();
return S_OK;
}
*ppv = NULL;
return ILS_E_NO_INTERFACE;
}
//****************************************************************************
// STDMETHODIMP_(ULONG)
// CClassFactory::AddRef (void)
//
// History:
// Tue 08-Oct-1996 09:00:26 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG)
CClassFactory::AddRef (void)
{
DllLock();
ASSERT (this == g_pClassFactory);
MyDebugMsg ((DM_REFCOUNT, "CClassFactory::AddRef: ref=%ld\r\n", cRef));
::InterlockedIncrement ((LONG *) &cRef);
return cRef;
}
//****************************************************************************
// STDMETHODIMP_(ULONG)
// CClassFactory::Release (void)
//
// History:
// Tue 08-Oct-1996 09:00:33 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP_(ULONG)
CClassFactory::Release (void)
{
DllRelease();
ASSERT (this == g_pClassFactory);
ASSERT (cRef > 0);
MyDebugMsg ((DM_REFCOUNT, "CClassFactory::Release: ref=%ld\r\n", cRef));
if (::InterlockedDecrement ((LONG *) &cRef) == 0)
{
delete this;
g_pClassFactory = NULL;
};
return cRef;
}
//****************************************************************************
// STDMETHODIMP
// CClassFactory::CreateInstance (LPUNKNOWN punkOuter, REFIID riid, void **ppv)
//
// History:
// Tue 08-Oct-1996 09:00:40 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CClassFactory::CreateInstance (LPUNKNOWN punkOuter, REFIID riid, void **ppv)
{
CIlsMain *pcu;
HRESULT hr;
if (ppv == NULL)
{
return ILS_E_POINTER;
};
*ppv = NULL;
if (punkOuter != NULL)
{
return CLASS_E_NOAGGREGATION;
};
// Allow only on instance of the ULS object
//
if (g_pCIls != NULL)
{
return ILS_E_FAIL;
};
pcu = new CIlsMain;
if (pcu != NULL)
{
hr = pcu->Init();
if (SUCCEEDED(hr))
{
*ppv = (IIlsMain *)pcu;
pcu->AddRef();
}
else
{
delete pcu;
};
}
else
{
hr = ILS_E_MEMORY;
};
return hr;
}
//****************************************************************************
// STDMETHODIMP
// CClassFactory::LockServer (BOOL fLock)
//
// History:
// Tue 08-Oct-1996 09:00:48 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDMETHODIMP
CClassFactory::LockServer (BOOL fLock)
{
if (fLock)
{
DllLock();
MyDebugMsg ((DM_REFCOUNT, "CClassFactory::LockServer\r\n"));
}
else
{
DllRelease();
MyDebugMsg ((DM_REFCOUNT, "CClassFactory::UNLockServer\r\n"));
};
return S_OK;
}
//****************************************************************************
// STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
//
// History:
// Tue 08-Oct-1996 09:00:55 -by- Viroon Touranachun [viroont]
// Created.
//****************************************************************************
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, void **ppv)
{
if (riid == IID_IClassFactory || riid == IID_IUnknown)
{
// Check the requested class
//
if (rclsid == CLSID_InternetLocationServices)
{
if (g_pClassFactory == NULL)
{
g_pClassFactory = new CClassFactory;
}
ASSERT (g_pClassFactory != NULL);
if ((*ppv = (void *) g_pClassFactory) != NULL)
{
g_pClassFactory->AddRef ();
return NOERROR;
}
else
{
return E_OUTOFMEMORY;
}
};
}
*ppv = NULL;
return CLASS_E_CLASSNOTAVAILABLE;
}