Kiln » TortoiseHg » TortoiseHg
Clone URL:  
Pushed to one repository · View In Graph Contained in 2.1.2 and tip

stable shellext: refactor common IUnknown implementation into a separate class

Changeset 58bbddf1abaf

Parent ea4ecbdd8d41

by David Golub

Changes to 7 files · Browse files at 58bbddf1abaf Showing diff from parent ea4ecbdd8d41 Diff from another changeset...

 
973
974
975
976
977
 
 
 
 
 
978
979
980
 
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
 
 
973
974
975
 
 
976
977
978
979
980
981
982
983
 
986
987
988
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
989
@@ -973,8 +973,11 @@
   CShellExtCMenu::CShellExtCMenu(const char dummy)  { - m_cRef = 0L; - CShellExt::IncDllRef(); + CShellExt::IncDllRef(); + ADDIFACE(IShellExtInit); + ADDIFACE(IContextMenu); + ADDIFACE(IContextMenu2); + ADDIFACE(IContextMenu3);  }     @@ -983,51 +986,4 @@
  CShellExt::DecDllRef();  }   - -STDMETHODIMP_(ULONG) CShellExtCMenu::AddRef() -{ - return ::InterlockedIncrement(&m_cRef); -} - - -STDMETHODIMP_(ULONG) CShellExtCMenu::Release() -{ - if(::InterlockedDecrement(&m_cRef)) - return m_cRef; - delete this; - return 0L; -} - - -STDMETHODIMP CShellExtCMenu::QueryInterface(REFIID riid, LPVOID FAR* ppv) -{ - if (ppv == 0) - return E_POINTER; - - *ppv = NULL; - - if (IsEqualIID(riid, IID_IShellExtInit) || IsEqualIID(riid, IID_IUnknown)) - { - *ppv = (LPSHELLEXTINIT) this; - } - else if (IsEqualIID(riid, IID_IContextMenu)) - { - *ppv = (LPCONTEXTMENU) this; - } - else if (IsEqualIID(riid, IID_IContextMenu2)) - { - *ppv = (IContextMenu2*) this; - } - else if (IsEqualIID(riid, IID_IContextMenu3)) - { - *ppv = (IContextMenu3*) this; - } - - if (*ppv) - { - AddRef(); - return S_OK; - } - - return E_NOINTERFACE; -} +IMPLEMENT_UNKNOWN(CShellExtCMenu)
 
5
6
7
 
 
8
9
10
 
19
20
21
22
 
23
24
25
 
43
44
45
46
47
48
49
 
50
51
52
 
5
6
7
8
9
10
11
12
 
21
22
23
 
24
25
26
27
 
45
46
47
 
 
 
 
48
49
50
51
@@ -5,6 +5,8 @@
 #include <string>  #include <map>   +#include "SimpleUnknown.h" +  struct MenuDescription  {   std::string name; @@ -19,7 +21,7 @@
 typedef std::map<UINT, MenuDescription> MenuIdCmdMap;     -class CShellExtCMenu: public IContextMenu3, IShellExtInit +class CShellExtCMenu: public CSimpleUnknown, IContextMenu3, IShellExtInit  {    protected: @@ -43,10 +45,7 @@
  explicit CShellExtCMenu(const char dummy);   ~CShellExtCMenu();   - // IUnknown - STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR *ppv); - STDMETHODIMP_(ULONG) AddRef(); - STDMETHODIMP_(ULONG) Release(); + DECLARE_UNKNOWN()     // IContextMenu3   STDMETHODIMP QueryContextMenu(
 
77
78
79
80
81
 
82
83
84
 
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
 
 
 
77
78
79
 
80
81
82
83
84
 
87
88
89
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
 
@@ -77,8 +77,8 @@
 CShellExtOverlay::CShellExtOverlay(char tortoiseClass) :   myTortoiseClass(tortoiseClass)  { - m_cRef = 0L;   CShellExt::IncDllRef(); + ADDIFACE(IShellIconOverlayIdentifier);  }     @@ -87,40 +87,4 @@
  CShellExt::DecDllRef();  }   - -STDMETHODIMP_(ULONG) CShellExtOverlay::AddRef() -{ - return ::InterlockedIncrement(&m_cRef); -} - - -STDMETHODIMP_(ULONG) CShellExtOverlay::Release() -{ - if(::InterlockedDecrement(&m_cRef)) - return m_cRef; - delete this; - return 0L; -} - - -STDMETHODIMP CShellExtOverlay::QueryInterface(REFIID riid, LPVOID FAR* ppv) -{ - if (ppv == 0) - return E_POINTER; - - *ppv = NULL; - - if (IsEqualIID(riid, IID_IShellIconOverlayIdentifier) - || IsEqualIID(riid, IID_IUnknown) ) - { - *ppv = (IShellIconOverlayIdentifier*) this; - } - - if (*ppv) - { - AddRef(); - return S_OK; - } - - return E_NOINTERFACE; -} +IMPLEMENT_UNKNOWN(CShellExtOverlay) \ No newline at end of file
 
1
2
3
 
4
5
 
6
7
8
9
10
11
12
13
14
15
16
17
 
18
19
20
 
1
2
3
4
5
 
6
7
 
8
9
10
11
12
13
 
 
 
 
14
15
16
17
@@ -1,20 +1,17 @@
 #ifndef _CShellExtOverlay_h_  #define _CShellExtOverlay_h_   +#include "SimpleUnknown.h"   -class CShellExtOverlay: public IShellIconOverlayIdentifier +class CShellExtOverlay: public CSimpleUnknown, public IShellIconOverlayIdentifier  { - ULONG m_cRef;   const char myTortoiseClass;    public:   explicit CShellExtOverlay(char Class);   ~CShellExtOverlay();   - // IUnknown - STDMETHODIMP QueryInterface(REFIID riid, LPVOID FAR *ppv); - STDMETHODIMP_(ULONG) AddRef(); - STDMETHODIMP_(ULONG) Release(); + DECLARE_UNKNOWN()     // IShellIconOverlayIdentifier   STDMETHODIMP GetOverlayInfo(
 
22
23
24
25
 
 
26
27
28
 
22
23
24
 
25
26
27
28
29
@@ -22,7 +22,8 @@
  DirectoryStatus.obj \   Thgstatus.obj \   QueryDirstate.obj \ - ThgVersion.obj + ThgVersion.obj \ + SimpleUnknown.obj    OBJECTS_TERMINATE = Thgstatus.obj \   RegistryConfig.obj \
Change 1 of 1 Show Entire File win32/​shellext/​SimpleUnknown.cpp Stacked
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
@@ -0,0 +1,76 @@
+// Copyright (C) 2011 Fog Creek Software +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. + +#include "stdafx.h" + +#include "SimpleUnknown.h" + +CSimpleUnknown::CSimpleUnknown() +{ + entries_ = NULL; + cRef_ = 0; + AddInterface(IID_IUnknown, this); +} + +CSimpleUnknown::~CSimpleUnknown() +{ + Entry* entry = entries_; + while (entry != NULL) + { + Entry* nextentry = entry->next; + delete entry; + entry = nextentry; + } +} + +void CSimpleUnknown::AddInterface(REFIID riid, LPUNKNOWN punk) +{ + Entry* newentry = new Entry; + newentry->iid = riid; + newentry->punk = punk; + newentry->next = entries_; + entries_ = newentry; +} + +STDMETHODIMP CSimpleUnknown::QueryInterface(REFIID riid, LPVOID FAR* ppv) +{ + if (ppv == NULL) + return E_POINTER; + + for (Entry* entry = entries_; entry != NULL; entry = entry->next) + { + if (entry->iid == riid) + { + entry->punk->AddRef(); + *ppv = entry->punk; + return S_OK; + } + } + *ppv = NULL; + return E_NOINTERFACE; +} + +STDMETHODIMP_(ULONG) CSimpleUnknown::AddRef() +{ + return ::InterlockedIncrement(&cRef_); +} + +STDMETHODIMP_(ULONG) CSimpleUnknown::Release() +{ + if (::InterlockedDecrement(&cRef_)) + return cRef_; + delete this; + return 0L; +}
Change 1 of 1 Show Entire File win32/​shellext/​SimpleUnknown.h Stacked
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
@@ -0,0 +1,62 @@
+// Copyright (C) 2011 Fog Creek Software +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 2 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <http://www.gnu.org/licenses/>. + +#ifndef _SIMPLEUNKNOWN_H_ +#define _SIMPLEUNKNOWN_H_ + +#define DECLARE_UNKNOWN() \ + STDMETHOD(QueryInterface)(REFIID riid, LPVOID FAR* ppv); \ + STDMETHOD_(ULONG, AddRef)(); \ + STDMETHOD_(ULONG, Release)(); \ + +#define IMPLEMENT_UNKNOWN(classname) \ + STDMETHODIMP classname::QueryInterface(REFIID riid, LPVOID FAR* ppv) \ + { \ + return CSimpleUnknown::QueryInterface(riid, ppv); \ + } \ + STDMETHODIMP_(ULONG) classname::AddRef() \ + { \ + return CSimpleUnknown::AddRef(); \ + } \ + STDMETHODIMP_(ULONG) classname::Release() \ + { \ + return CSimpleUnknown::Release(); \ + } + +#define ADDIFACE(iface) \ + AddInterface(IID_##iface, (iface*)this) + +class CSimpleUnknown : public IUnknown +{ + struct Entry + { + IID iid; + LPUNKNOWN punk; + Entry* next; + }; + Entry* entries_; + UINT cRef_; + +protected: + void AddInterface(REFIID riid, IUnknown* punk); + +public: + CSimpleUnknown(); + virtual ~CSimpleUnknown(); + + DECLARE_UNKNOWN() +}; + +#endif