Changeset a6817b2ccc9a…
Parent acedf4c93aab…
by
Changes to 3 files · Browse files at a6817b2ccc9a Showing diff from parent acedf4c93aab Diff from another changeset...
|
@@ -3,6 +3,8 @@ #include "TortoiseUtils.h"
#include "StringUtils.h"
#include "InitStatus.h"
+#include "ThgClassFactory.h"
+
#include <olectl.h>
#define INITGUID
@@ -75,34 +77,32 @@ TDEBUG_TRACE("DllGetClassObject clsid = " << WideToMultibyte(pwszShellExt));
*ppvOut = NULL;
+ typedef ThgClassFactory<CShellExt> Fact;
+
if (IsEqualIID(rclsid, CLSID_TortoiseHg0))
{
- CDllRegSxClassFactory *pcf =
- new CDllRegSxClassFactory('C'); // clean
+ Fact *pcf = new Fact('C'); // clean
TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg0");
++InitStatus::inst().unchanged_;
return pcf->QueryInterface(riid, ppvOut);
}
else if (IsEqualIID(rclsid, CLSID_TortoiseHg1))
{
- CDllRegSxClassFactory *pcf =
- new CDllRegSxClassFactory('A'); // added
+ Fact *pcf = new Fact('A'); // added
TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg1");
++InitStatus::inst().added_;
return pcf->QueryInterface(riid, ppvOut);
}
else if (IsEqualIID(rclsid, CLSID_TortoiseHg2))
{
- CDllRegSxClassFactory *pcf =
- new CDllRegSxClassFactory('M'); // modified
+ Fact *pcf = new Fact('M'); // modified
TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg2");
++InitStatus::inst().modified_;
return pcf->QueryInterface(riid, ppvOut);
}
else if (IsEqualIID(rclsid, CLSID_TortoiseHg6))
{
- CDllRegSxClassFactory *pcf =
- new CDllRegSxClassFactory('?'); // not in repo
+ Fact *pcf = new Fact('?'); // not in repo
TDEBUG_TRACE("DllGetClassObject clsname = " << "CLSID_TortoiseHg6");
++InitStatus::inst().notinrepo_;
return pcf->QueryInterface(riid, ppvOut);
@@ -124,84 +124,6 @@}
-LPCRITICAL_SECTION CDllRegSxClassFactory::GetCriticalSection()
-{
- return &g_critical_section;
-}
-
-
-CDllRegSxClassFactory::CDllRegSxClassFactory(char classToMake) :
- myclassToMake(classToMake)
-{
- ThgCriticalSection cs(GetCriticalSection());
- m_cRef = 0L;
- g_cRefThisDll++;
-}
-
-
-CDllRegSxClassFactory::~CDllRegSxClassFactory()
-{
- ThgCriticalSection cs(GetCriticalSection());
- g_cRefThisDll--;
-}
-
-
-STDMETHODIMP CDllRegSxClassFactory::QueryInterface(
- REFIID riid, LPVOID FAR* ppv)
-{
- *ppv = NULL;
-
- if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
- {
- *ppv = (LPCLASSFACTORY) this;
- AddRef();
- return NOERROR;
- }
-
- return E_NOINTERFACE;
-}
-
-
-STDMETHODIMP_(ULONG) CDllRegSxClassFactory::AddRef()
-{
- ThgCriticalSection cs(GetCriticalSection());
- return ++m_cRef;
-}
-
-
-STDMETHODIMP_(ULONG) CDllRegSxClassFactory::Release()
-{
- ThgCriticalSection cs(GetCriticalSection());
- if (--m_cRef)
- return m_cRef;
-
- delete this;
- return 0L;
-}
-
-
-STDMETHODIMP CDllRegSxClassFactory::CreateInstance(
- LPUNKNOWN pUnkOuter, REFIID riid, LPVOID* ppvObj)
-{
- *ppvObj = NULL;
-
- if (pUnkOuter)
- return CLASS_E_NOAGGREGATION;
-
- LPCSHELLEXT pShellExt = new CShellExt(myclassToMake);
- if (NULL == pShellExt)
- return E_OUTOFMEMORY;
-
- return pShellExt->QueryInterface(riid, ppvObj);
-}
-
-
-STDMETHODIMP CDllRegSxClassFactory::LockServer(BOOL fLock)
-{
- return NOERROR;
-}
-
-
CShellExt::CShellExt(char tortoiseClass) :
myTortoiseClass(tortoiseClass),
m_ppszFileUserClickedOn(0)
@@ -232,6 +154,20 @@}
+void CShellExt::IncDllRef()
+{
+ ThgCriticalSection cs(GetCriticalSection());
+ g_cRefThisDll++;
+}
+
+
+void CShellExt::DecDllRef()
+{
+ ThgCriticalSection cs(GetCriticalSection());
+ g_cRefThisDll--;
+}
+
+
STDMETHODIMP CShellExt::QueryInterface(REFIID riid, LPVOID FAR* ppv)
{
*ppv = NULL;
|
@@ -5,27 +5,6 @@ #include <string>
-class CDllRegSxClassFactory: public IClassFactory
-{
- protected:
- ULONG m_cRef;
- const char myclassToMake;
-
- public:
- explicit CDllRegSxClassFactory(char classToMake);
- ~CDllRegSxClassFactory();
-
- static LPCRITICAL_SECTION GetCriticalSection();
-
- STDMETHODIMP QueryInterface(REFIID, LPVOID FAR*);
- STDMETHODIMP_(ULONG) AddRef();
- STDMETHODIMP_(ULONG) Release();
-
- STDMETHODIMP CreateInstance(LPUNKNOWN, REFIID, LPVOID FAR*);
- STDMETHODIMP LockServer(BOOL);
-};
-
-
class CShellExt:
public IContextMenu3, IShellIconOverlayIdentifier, IShellExtInit
{
@@ -43,6 +22,8 @@
public:
static LPCRITICAL_SECTION GetCriticalSection();
+ static void IncDllRef();
+ static void DecDllRef();
explicit CShellExt(char Class);
~CShellExt();
|
|
@@ -0,0 +1,86 @@ + #ifndef _ThgClassFactory_h_
+#define _ThgClassFactory_h_
+
+#include "ShellExt.h"
+
+
+template <class T>
+class ThgClassFactory: public IClassFactory
+{
+ ULONG m_cRef;
+ const char myclassToMake;
+
+public:
+ explicit ThgClassFactory(char classToMake) :
+ myclassToMake(classToMake)
+ {
+ CShellExt::IncDllRef();
+ m_cRef = 0L;
+ }
+
+
+ ~ThgClassFactory()
+ {
+ CShellExt::DecDllRef();
+ }
+
+
+ STDMETHODIMP QueryInterface(
+ REFIID riid, LPVOID FAR* ppv)
+ {
+ *ppv = NULL;
+
+ if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory))
+ {
+ *ppv = (LPCLASSFACTORY) this;
+ AddRef();
+ return NOERROR;
+ }
+
+ return E_NOINTERFACE;
+ }
+
+
+ STDMETHODIMP_(ULONG) AddRef()
+ {
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ return ++m_cRef;
+ }
+
+
+ STDMETHODIMP_(ULONG) Release()
+ {
+ ThgCriticalSection cs(CShellExt::GetCriticalSection());
+ if (--m_cRef)
+ return m_cRef;
+
+ delete this;
+ return 0L;
+ }
+
+
+ STDMETHODIMP CreateInstance(
+ LPUNKNOWN pUnkOuter, REFIID riid, LPVOID* ppvObj)
+ {
+ *ppvObj = NULL;
+
+ if (pUnkOuter)
+ return CLASS_E_NOAGGREGATION;
+
+ T *pShellExt = new T(myclassToMake);
+ if (NULL == pShellExt)
+ return E_OUTOFMEMORY;
+
+ return pShellExt->QueryInterface(riid, ppvObj);
+ }
+
+
+ STDMETHODIMP LockServer(BOOL fLock)
+ {
+ return NOERROR;
+ }
+
+};
+
+
+#endif
|
Loading...