//+------------------------------------------------------------------------- // // 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(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; }