added a readme file where to find the source code for TortoiseOverlays
[TortoiseGit.git] / src / TortoiseOverlays / ShellExtClassFactory.cpp
blob596d149cabe3ba7f952b0d882a6e260651e0376f
1 // TortoiseOverlays - an overlay handler for Tortoise clients
2 // Copyright (C) 2007, 2010 - TortoiseSVN
3 #include "stdafx.h"
4 #include "ShellExt.h"
5 #include "ShellExtClassFactory.h"
7 CShellExtClassFactory::CShellExtClassFactory(FileState state)
9 m_StateToMake = state;
11 m_cRef = 0L;
13 InterlockedIncrement(g_cRefThisDll);
16 CShellExtClassFactory::~CShellExtClassFactory()
18 InterlockedDecrement(g_cRefThisDll);
21 STDMETHODIMP CShellExtClassFactory::QueryInterface(REFIID riid,
22 LPVOID FAR *ppv)
24 if(ppv == 0)
25 return E_POINTER;
27 *ppv = NULL;
29 // Any interface on this object is the object pointer
31 if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
33 *ppv = (LPCLASSFACTORY)this;
35 AddRef();
37 return NOERROR;
40 return E_NOINTERFACE;
43 STDMETHODIMP_(ULONG) CShellExtClassFactory::AddRef()
45 return ++m_cRef;
48 STDMETHODIMP_(ULONG) CShellExtClassFactory::Release()
50 if (--m_cRef)
51 return m_cRef;
53 delete this;
55 return 0L;
58 STDMETHODIMP CShellExtClassFactory::CreateInstance(LPUNKNOWN pUnkOuter,
59 REFIID riid,
60 LPVOID *ppvObj)
62 if(ppvObj == 0)
63 return E_POINTER;
65 *ppvObj = NULL;
67 // Shell extensions typically don't support aggregation (inheritance)
69 if (pUnkOuter)
70 return CLASS_E_NOAGGREGATION;
72 // Create the main shell extension object. The shell will then call
73 // QueryInterface with IID_IShellExtInit--this is how shell extensions are
74 // initialized.
76 CShellExt* pShellExt = new (std::nothrow) CShellExt(m_StateToMake); //Create the CShellExt object
78 if (NULL == pShellExt)
79 return E_OUTOFMEMORY;
80 const HRESULT hr = pShellExt->QueryInterface(riid, ppvObj);
81 if(FAILED(hr))
82 delete pShellExt;
83 return hr;
86 STDMETHODIMP CShellExtClassFactory::LockServer(BOOL /*fLock*/)
88 return E_NOTIMPL;