Kiln » TortoiseHg » TortoiseHg
Clone URL:  
ThgClassFactory.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
#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) { if (ppv == 0) return E_POINTER; *ppv = NULL; if (IsEqualIID(riid, IID_IUnknown) || IsEqualIID(riid, IID_IClassFactory)) { *ppv = (LPCLASSFACTORY) this; AddRef(); return S_OK; } 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) { if (ppvObj == 0) return E_POINTER; *ppvObj = NULL; if (pUnkOuter) return CLASS_E_NOAGGREGATION; T *pShellExt = new T(myclassToMake); if (NULL == pShellExt) return E_OUTOFMEMORY; const HRESULT hr = pShellExt->QueryInterface(riid, ppvObj); if (FAILED(hr)) delete pShellExt; return hr; } STDMETHODIMP LockServer(BOOL fLock) { return S_OK; } }; #endif