259 lines
4.9 KiB
C++
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;
|
||
|
}
|
||
|
|
||
|
|