windows-nt/Source/XPSP1/NT/enduser/windows.com/wuau/wuaueng/aucpl.cpp
2020-09-26 16:20:57 +08:00

259 lines
4.9 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 2000
//
// File: aucpl.cpp
//
//--------------------------------------------------------------------------
#include "pch.h"
#pragma hdrstop
HINSTANCE g_hInstance = NULL;
LONG g_cRefDll = 0;
// {5F327514-6C5E-4d60-8F16-D07FA08A78ED}
//DEFINE_GUID(CLSID_AutoUpdatePropSheet,
//0x5f327514, 0x6c5e, 0x4d60, 0x8f, 0x16, 0xd0, 0x7f, 0xa0, 0x8a, 0x78, 0xed);
class __declspec(uuid("5f327514-6c5e-4d60-8f16-d07fa08a78ed")) CAutoUpdatePropSheet;
//-----------------------------------------------------------------------------
// COM server class factory.
//-----------------------------------------------------------------------------
class CAutoUpdateClassFactory : IClassFactory
{
public:
~CAutoUpdateClassFactory(void);
//
// IUnknown methods
//
STDMETHOD(QueryInterface)(REFIID riid, void **ppvOut);
STDMETHOD_(ULONG, AddRef)(void);
STDMETHOD_(ULONG, Release)(void);
//
// IClassFactory methods
//
STDMETHOD(CreateInstance)(LPUNKNOWN pUnkOuter, REFIID riid, void **ppvOut);
STDMETHOD(LockServer)(BOOL);
//
// Instance generator.
//
static HRESULT CreateInstance(REFIID riid, void **ppvOut);
private:
LONG m_cRef;
//
// Force use of instance generator.
//
CAutoUpdateClassFactory(void);
//
// Prevent copy.
//
CAutoUpdateClassFactory(const CAutoUpdateClassFactory& rhs); // not implemented.
CAutoUpdateClassFactory& operator = (const CAutoUpdateClassFactory& rhs); // not implemented.
};
//
// Instance generator.
//
HRESULT
CAutoUpdateClassFactory::CreateInstance( // [static]
REFIID riid,
void **ppvOut
)
{
HRESULT hr = E_OUTOFMEMORY;
CAutoUpdateClassFactory *pFactory = new CAutoUpdateClassFactory();
if (NULL != pFactory)
{
hr = pFactory->QueryInterface(riid, ppvOut);
pFactory->Release();
}
return hr;
}
CAutoUpdateClassFactory::CAutoUpdateClassFactory(void)
: m_cRef(1)
{
DllAddRef();
}
CAutoUpdateClassFactory::~CAutoUpdateClassFactory(void)
{
DllRelease();
}
STDMETHODIMP
CAutoUpdateClassFactory::QueryInterface(
REFIID riid,
void **ppvOut
)
{
HRESULT hr = E_NOINTERFACE;
if (NULL == ppvOut)
return E_INVALIDARG;
*ppvOut = NULL;
if (IID_IClassFactory == riid || IID_IUnknown == riid)
{
*ppvOut = static_cast<IClassFactory *>(this);
}
if (NULL != *ppvOut)
{
((LPUNKNOWN)*ppvOut)->AddRef();
hr = NOERROR;
}
return hr;
}
STDMETHODIMP_(ULONG) CAutoUpdateClassFactory::AddRef(void)
{
return InterlockedIncrement(&m_cRef);
}
STDMETHODIMP_(ULONG) CAutoUpdateClassFactory::Release(void)
{
if (InterlockedDecrement(&m_cRef))
return m_cRef;
delete this;
return 0;
}
STDMETHODIMP
CAutoUpdateClassFactory::CreateInstance(
IUnknown *pUnkOuter,
REFIID riid,
void **ppvOut
)
{
HRESULT hr = CLASS_E_NOAGGREGATION;
if (NULL == ppvOut)
{
return E_INVALIDARG;
}
*ppvOut = NULL;
if (NULL == pUnkOuter)
{
if (IID_IShellExtInit == riid ||
IID_IShellPropSheetExt == riid ||
IID_IUnknown == riid)
{
hr = CAutoUpdatePropSheet_CreateInstance(g_hInstance, riid, ppvOut);
}
else
{
hr = E_NOINTERFACE;
}
}
return hr;
}
STDMETHODIMP
CAutoUpdateClassFactory::LockServer(
BOOL fLock
)
{
if (fLock)
DllAddRef();
else
DllRelease();
return S_OK;
}
//-----------------------------------------------------------------------------
// Standard COM server exports.
//-----------------------------------------------------------------------------
STDAPI
DllGetClassObject(
REFCLSID rclsid,
REFIID riid,
void **ppvOut
)
{
HRESULT hr = CLASS_E_CLASSNOTAVAILABLE;
if (NULL == ppvOut)
{
return E_INVALIDARG;
}
*ppvOut = NULL;
if (__uuidof(CAutoUpdatePropSheet) == rclsid)
{
hr = CAutoUpdateClassFactory::CreateInstance(riid, ppvOut);
}
return hr;
}
STDAPI DllCanUnloadNow(void)
{
HRESULT hr = (0 == g_cRefDll ? S_OK : S_FALSE);
return hr;
}
STDAPI_(void) DllAddRef(void)
{
InterlockedIncrement(&g_cRefDll);
}
STDAPI_(void) DllRelease(void)
{
InterlockedDecrement(&g_cRefDll);
}
BOOL APIENTRY
DllMain(
HANDLE hModule,
DWORD dwReason,
LPVOID /*lpReserved*/
)
{
switch (dwReason)
{
case DLL_PROCESS_ATTACH:
g_hInstance = (HINSTANCE)hModule;
DisableThreadLibraryCalls(g_hInstance);
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}