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  }