ClassFactory.cpp
1 #include "pch.h" 2 #include "ClassFactory.h" 3 #include "QoiThumbnailProvider.h" 4 5 #include <new> 6 #include <Shlwapi.h> 7 8 extern long g_cDllRef; 9 10 ClassFactory::ClassFactory() : 11 m_cRef(1) 12 { 13 InterlockedIncrement(&g_cDllRef); 14 } 15 16 ClassFactory::~ClassFactory() 17 { 18 InterlockedDecrement(&g_cDllRef); 19 } 20 21 // 22 // IUnknown 23 // 24 25 IFACEMETHODIMP ClassFactory::QueryInterface(REFIID riid, void **ppv) 26 { 27 static const QITAB qit[] = { 28 QITABENT(ClassFactory, IClassFactory), 29 { 0 }, 30 }; 31 return QISearch(this, qit, riid, ppv); 32 } 33 34 IFACEMETHODIMP_(ULONG) ClassFactory::AddRef() 35 { 36 return InterlockedIncrement(&m_cRef); 37 } 38 39 IFACEMETHODIMP_(ULONG) ClassFactory::Release() 40 { 41 ULONG cRef = InterlockedDecrement(&m_cRef); 42 if (0 == cRef) 43 { 44 delete this; 45 } 46 return cRef; 47 } 48 49 // 50 // IClassFactory 51 // 52 53 IFACEMETHODIMP ClassFactory::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppv) 54 { 55 HRESULT hr = CLASS_E_NOAGGREGATION; 56 57 if (pUnkOuter == NULL) 58 { 59 hr = E_OUTOFMEMORY; 60 61 QoiThumbnailProvider* pExt = new (std::nothrow) QoiThumbnailProvider(); 62 if (pExt) 63 { 64 hr = pExt->QueryInterface(riid, ppv); 65 pExt->Release(); 66 } 67 } 68 69 return hr; 70 } 71 72 IFACEMETHODIMP ClassFactory::LockServer(BOOL fLock) 73 { 74 if (fLock) 75 { 76 InterlockedIncrement(&g_cDllRef); 77 } 78 else 79 { 80 InterlockedDecrement(&g_cDllRef); 81 } 82 83 return S_OK; 84 }