FireBreath  1.4.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Pages
axutil.cpp
1 /**********************************************************\
2 Original Author: Georg Fritzsche
3 
4 Created: Sept 17, 2009
5 License: Dual license model; choose one of two:
6  New BSD License
7  http://www.opensource.org/licenses/bsd-license.php
8  - or -
9  GNU Lesser General Public License, version 2.1
10  http://www.gnu.org/licenses/lgpl-2.1.html
11 
12 Copyright 2009 Richard Bateman, Firebreath development team
13 \**********************************************************/
14 
15 #include "precompiled_headers.h" // On windows, everything above this line in PCH
16 #include "axutil.h"
17 #include "atlstr.h"
18 
19 using namespace FB;
20 using namespace FB::ActiveX;
21 
22 FbPerUserRegistration::FbPerUserRegistration(bool perUser)
23 #if _ATL_VER < 0x0900
24  : m_mapping(false)
25 #endif
26 {
27 #if _ATL_VER < 0x0900
28  // this seems to be always active and therefore may break
29  // any COM functionality thats not registered per user
30 
31  if (!perUser) {
32  return;
33  }
34 
35  HKEY key;
36 
37  LONG err = ::RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Classes"), 0, MAXIMUM_ALLOWED, &key);
38  if(err == ERROR_SUCCESS) {
39  err = ::RegOverridePredefKey(HKEY_CLASSES_ROOT, key);
40  ::RegCloseKey(key);
41  }
42 
43  if (err == ERROR_SUCCESS) {
44  EnablePerUserTLibRegistration();
45  m_mapping = true;
46  }
47 #else // _ATL_VER >= 0900
48  AtlSetPerUserRegistration(perUser);
49 #endif
50 }
51 
52 #if _ATL_VER < 0x0900
53 void FbPerUserRegistration::EnablePerUserTLibRegistration()
54 {
55  HMODULE hOleaut32 = ::GetModuleHandle(TEXT("Oleaut32.dll"));
56  assert(hOleaut32);
57 
58  typedef void (WINAPI * EnablePerUserTLibRegistrationProcPtr) (void);
59  EnablePerUserTLibRegistrationProcPtr enablePerUserTLibRegistrationProcPtr =
60  reinterpret_cast<EnablePerUserTLibRegistrationProcPtr>(
61  GetProcAddress(hOleaut32, "OaEnablePerUserTLibRegistration"));
62  if (enablePerUserTLibRegistrationProcPtr) {
63  enablePerUserTLibRegistrationProcPtr();
64  }
65 }
66 
67 #endif
68 
69 FB::ActiveX::FbPerUserRegistration::~FbPerUserRegistration()
70 {
71 #if _ATL_VER < 0x0900
72  if (m_mapping)
73  ::RegOverridePredefKey(HKEY_CLASSES_ROOT, NULL);
74 #endif
75 }
76 
77 using FB::ActiveX::AxIdMap;
78 
79 #define DISPID_EVENTS 0x80010000 + 6000
80 
81 class AxIdMapInit
82 {
83 public:
84  AxIdMapInit()
85  {
86  // As of IE9 some events seem to have predefined DISPIDs; let's try to define those here:
87  AxIdMap.setIdForValue((DISPID_EVENTS + 28), "onabort");
88  AxIdMap.setIdForValue((DISPID_EVENTS + 87), "onactivate");
89  AxIdMap.setIdForValue((DISPID_EVENTS + 67), "onafterprint");
90  AxIdMap.setIdForValue((DISPID_EVENTS + 22), "onafterupdate");
91  AxIdMap.setIdForValue((DISPID_EVENTS + 104), "onalert");
92  AxIdMap.setIdForValue((DISPID_EVENTS + 70), "onattachevent");
93  AxIdMap.setIdForValue((DISPID_EVENTS + 90), "onbeforeactivate");
94  AxIdMap.setIdForValue((DISPID_EVENTS + 59), "onbeforecopy");
95  AxIdMap.setIdForValue((DISPID_EVENTS + 58), "onbeforecut");
96  AxIdMap.setIdForValue((DISPID_EVENTS + 77), "onbeforedeactivate");
97  AxIdMap.setIdForValue((DISPID_EVENTS + 23), "onbeforedragover");
98  AxIdMap.setIdForValue((DISPID_EVENTS + 24), "onbeforedroporpaste");
99  AxIdMap.setIdForValue((DISPID_EVENTS + 69), "onbeforeeditfocus");
100  AxIdMap.setIdForValue((DISPID_EVENTS + 60), "onbeforepaste");
101  AxIdMap.setIdForValue((DISPID_EVENTS + 66), "onbeforeprint");
102  AxIdMap.setIdForValue((DISPID_EVENTS + 39), "onbeforeunload");
103  AxIdMap.setIdForValue((DISPID_EVENTS + 21), "onbeforeupdate");
104  AxIdMap.setIdForValue((DISPID_EVENTS + 15), "onblur");
105  AxIdMap.setIdForValue((DISPID_EVENTS + 20), "onbounce");
106  AxIdMap.setIdForValue((DISPID_EVENTS + 64), "oncellchange");
107  AxIdMap.setIdForValue((DISPID_EVENTS + 30), "onchange");
108  AxIdMap.setIdForValue((DISPID_EVENTS + 45), "onchangeblur");
109  AxIdMap.setIdForValue((DISPID_EVENTS + 44), "onchangefocus");
110  AxIdMap.setIdForValue((DISPID_EVENTS + 8), "onclick");
111  AxIdMap.setIdForValue((DISPID_EVENTS + 72), "oncontentready");
112  AxIdMap.setIdForValue((DISPID_EVENTS + 65), "oncontextmenu");
113  AxIdMap.setIdForValue((DISPID_EVENTS + 79), "oncontrolselect");
114  AxIdMap.setIdForValue((DISPID_EVENTS + 56), "oncopy");
115  AxIdMap.setIdForValue((DISPID_EVENTS + 55), "oncut");
116  AxIdMap.setIdForValue((DISPID_EVENTS + 41), "ondataavailable");
117  AxIdMap.setIdForValue((DISPID_EVENTS + 40), "ondatasetchanged");
118  AxIdMap.setIdForValue((DISPID_EVENTS + 42), "ondatasetcomplete");
119  AxIdMap.setIdForValue((DISPID_EVENTS + 9), "ondblclick");
120  AxIdMap.setIdForValue((DISPID_EVENTS + 88), "ondeactivate");
121  AxIdMap.setIdForValue((DISPID_EVENTS + 111), "ondommutation");
122  AxIdMap.setIdForValue((DISPID_EVENTS + 49), "ondrag");
123  AxIdMap.setIdForValue((DISPID_EVENTS + 50), "ondragend");
124  AxIdMap.setIdForValue((DISPID_EVENTS + 51), "ondragenter");
125  AxIdMap.setIdForValue((DISPID_EVENTS + 53), "ondragleave");
126  AxIdMap.setIdForValue((DISPID_EVENTS + 52), "ondragover");
127  AxIdMap.setIdForValue((DISPID_EVENTS + 35), "ondragstart");
128  AxIdMap.setIdForValue((DISPID_EVENTS + 54), "ondrop");
129  AxIdMap.setIdForValue((DISPID_EVENTS + 29), "onerror");
130  AxIdMap.setIdForValue((DISPID_EVENTS + 38), "onerrorupdate");
131  AxIdMap.setIdForValue((DISPID_EVENTS + 43), "onfilter");
132  AxIdMap.setIdForValue((DISPID_EVENTS + 26), "onfinish");
133  AxIdMap.setIdForValue((DISPID_EVENTS + 14), "onfocus");
134  AxIdMap.setIdForValue((DISPID_EVENTS + 91), "onfocusin");
135  AxIdMap.setIdForValue((DISPID_EVENTS + 92), "onfocusout");
136  AxIdMap.setIdForValue((DISPID_EVENTS + 109), "onhashchange");
137  AxIdMap.setIdForValue((DISPID_EVENTS + 13), "onhelp");
138  AxIdMap.setIdForValue((DISPID_EVENTS + 103), "onhide");
139  AxIdMap.setIdForValue((DISPID_EVENTS + 5), "onkeydown");
140  AxIdMap.setIdForValue((DISPID_EVENTS + 7), "onkeypress");
141  AxIdMap.setIdForValue((DISPID_EVENTS + 6), "onkeyup");
142  AxIdMap.setIdForValue((DISPID_EVENTS + 34), "onlayout");
143  AxIdMap.setIdForValue((DISPID_EVENTS + 73), "onlayoutcomplete");
144  AxIdMap.setIdForValue((DISPID_EVENTS + 75), "onlinkedoverflow");
145  AxIdMap.setIdForValue((DISPID_EVENTS + 32), "onload");
146  AxIdMap.setIdForValue((DISPID_EVENTS + 46), "onlosecapture");
147  AxIdMap.setIdForValue((DISPID_EVENTS + 110), "onmessage");
148  AxIdMap.setIdForValue((DISPID_EVENTS + 2), "onmousedown");
149  AxIdMap.setIdForValue((DISPID_EVENTS + 85), "onmouseenter");
150  AxIdMap.setIdForValue((DISPID_EVENTS + 71), "onmousehover");
151  AxIdMap.setIdForValue((DISPID_EVENTS + 86), "onmouseleave");
152  AxIdMap.setIdForValue((DISPID_EVENTS + 4), "onmousemove");
153  AxIdMap.setIdForValue((DISPID_EVENTS + 1), "onmouseout");
154  AxIdMap.setIdForValue((DISPID_EVENTS + 0), "onmouseover");
155  AxIdMap.setIdForValue((DISPID_EVENTS + 3), "onmouseup");
156  AxIdMap.setIdForValue((DISPID_EVENTS + 76), "onmousewheel");
157  AxIdMap.setIdForValue((DISPID_EVENTS + 78), "onmove");
158  AxIdMap.setIdForValue((DISPID_EVENTS + 82), "onmoveend");
159  AxIdMap.setIdForValue((DISPID_EVENTS + 81), "onmovestart");
160  AxIdMap.setIdForValue((DISPID_EVENTS + 89), "onmultilayoutcleanup");
161  AxIdMap.setIdForValue((DISPID_EVENTS + 99), "onobjectcontentscrolled");
162  AxIdMap.setIdForValue((DISPID_EVENTS + 108), "onoffline");
163  AxIdMap.setIdForValue((DISPID_EVENTS + 107), "ononline");
164  AxIdMap.setIdForValue((DISPID_EVENTS + 74), "onpage");
165  AxIdMap.setIdForValue((DISPID_EVENTS + 57), "onpaste");
166  AxIdMap.setIdForValue((DISPID_EVENTS + 61), "onpersistload");
167  AxIdMap.setIdForValue((DISPID_EVENTS + 48), "onpersistsave");
168  AxIdMap.setIdForValue((DISPID_EVENTS + 106), "onpopupmenuend");
169  AxIdMap.setIdForValue((DISPID_EVENTS + 105), "onpopupmenustart");
170  AxIdMap.setIdForValue((DISPID_EVENTS + 47), "onpropertychange");
171  AxIdMap.setIdForValue((DISPID_EVENTS + 25), "onreadystatechange");
172  AxIdMap.setIdForValue((DISPID_EVENTS + 12), "onreset");
173  AxIdMap.setIdForValue((DISPID_EVENTS + 36), "onresize");
174  AxIdMap.setIdForValue((DISPID_EVENTS + 84), "onresizeend");
175  AxIdMap.setIdForValue((DISPID_EVENTS + 83), "onresizestart");
176  AxIdMap.setIdForValue((DISPID_EVENTS + 19), "onrowenter");
177  AxIdMap.setIdForValue((DISPID_EVENTS + 18), "onrowexit");
178  AxIdMap.setIdForValue((DISPID_EVENTS + 62), "onrowsdelete");
179  AxIdMap.setIdForValue((DISPID_EVENTS + 63), "onrowsinserted");
180  AxIdMap.setIdForValue((DISPID_EVENTS + 31), "onscroll");
181  AxIdMap.setIdForValue((DISPID_EVENTS + 10), "onselect");
182  AxIdMap.setIdForValue((DISPID_EVENTS + 94), "onselectadd");
183  AxIdMap.setIdForValue((DISPID_EVENTS + 80), "onselectionchange");
184  AxIdMap.setIdForValue((DISPID_EVENTS + 95), "onselectremove");
185  AxIdMap.setIdForValue((DISPID_EVENTS + 37), "onselectstart");
186  AxIdMap.setIdForValue((DISPID_EVENTS + 96), "onselectwithin");
187  AxIdMap.setIdForValue((DISPID_EVENTS + 102), "onshow");
188  AxIdMap.setIdForValue((DISPID_EVENTS + 27), "onstart");
189  AxIdMap.setIdForValue((DISPID_EVENTS + 68), "onstop");
190  AxIdMap.setIdForValue((DISPID_EVENTS + 100), "onstorage");
191  AxIdMap.setIdForValue((DISPID_EVENTS + 101), "onstoragecommit");
192  AxIdMap.setIdForValue((DISPID_EVENTS + 11), "onsubmit");
193  AxIdMap.setIdForValue((DISPID_EVENTS + 98), "onsystemscrollingend");
194  AxIdMap.setIdForValue((DISPID_EVENTS + 97), "onsystemscrollingstart");
195  AxIdMap.setIdForValue((DISPID_EVENTS + 33), "onunload");
196  AxIdMap.setIdForValue((DISPID_EVENTS + 93), "onvaluechange");
197 
198 
199  AxIdMap.setIdForValue((DISPID_EVENTS + 112), "ontimeout");
200  AxIdMap.setIdForValue((DISPID_EVENTS + 113), "onwheel");
201  AxIdMap.setIdForValue((DISPID_EVENTS + 114), "onsvgload");
202  AxIdMap.setIdForValue((DISPID_EVENTS + 115), "onsvgunload");
203  AxIdMap.setIdForValue((DISPID_EVENTS + 116), "onsvgabort");
204  AxIdMap.setIdForValue((DISPID_EVENTS + 117), "onsvgerror");
205  AxIdMap.setIdForValue((DISPID_EVENTS + 118), "onsvgresize");
206  AxIdMap.setIdForValue((DISPID_EVENTS + 119), "onsvgscroll");
207  AxIdMap.setIdForValue((DISPID_EVENTS + 120), "onsvgzoom");
208  AxIdMap.setIdForValue((DISPID_EVENTS + 121), "ononmsthumbnailclick");
209  AxIdMap.setIdForValue((DISPID_EVENTS + 122), "oncompositionstart");
210  AxIdMap.setIdForValue((DISPID_EVENTS + 123), "oncompositionupdate");
211  AxIdMap.setIdForValue((DISPID_EVENTS + 124), "oncompositionend");
212  AxIdMap.setIdForValue((DISPID_EVENTS + 125), "ondomattrmodified");
213  AxIdMap.setIdForValue((DISPID_EVENTS + 126), "ondomcontentloaded");
214  AxIdMap.setIdForValue((DISPID_EVENTS + 127), "oninput");
215  AxIdMap.setIdForValue((DISPID_EVENTS + 128), "ondomchardatamodified");
216  AxIdMap.setIdForValue((DISPID_EVENTS + 129), "ontextinput");
217  AxIdMap.setIdForValue((DISPID_EVENTS + 130), "ononmssitemodejumplistitemremoved");
218  AxIdMap.setIdForValue((DISPID_EVENTS + 131), "ondomnodeinserted");
219  AxIdMap.setIdForValue((DISPID_EVENTS + 132), "ondomnoderemoved");
220  AxIdMap.setIdForValue((DISPID_EVENTS + 133), "ondomsubtreemodified");
221  AxIdMap.setIdForValue((DISPID_EVENTS + 134), "oncanplay");
222  AxIdMap.setIdForValue((DISPID_EVENTS + 135), "oncanplaythrough");
223  AxIdMap.setIdForValue((DISPID_EVENTS + 136), "ondurationchange");
224  AxIdMap.setIdForValue((DISPID_EVENTS + 137), "onemptied");
225  AxIdMap.setIdForValue((DISPID_EVENTS + 138), "onended");
226  AxIdMap.setIdForValue((DISPID_EVENTS + 139), "onloadeddata");
227  AxIdMap.setIdForValue((DISPID_EVENTS + 140), "onloadedmetadata");
228  AxIdMap.setIdForValue((DISPID_EVENTS + 141), "onloadstart");
229  AxIdMap.setIdForValue((DISPID_EVENTS + 142), "onpause");
230  AxIdMap.setIdForValue((DISPID_EVENTS + 143), "onplay");
231  AxIdMap.setIdForValue((DISPID_EVENTS + 144), "onplaying");
232  AxIdMap.setIdForValue((DISPID_EVENTS + 145), "onprogress");
233  AxIdMap.setIdForValue((DISPID_EVENTS + 146), "onratechange");
234  AxIdMap.setIdForValue((DISPID_EVENTS + 147), "onseeked");
235  AxIdMap.setIdForValue((DISPID_EVENTS + 148), "onseeking");
236  AxIdMap.setIdForValue((DISPID_EVENTS + 149), "onstalled");
237  AxIdMap.setIdForValue((DISPID_EVENTS + 150), "onsuspend");
238  AxIdMap.setIdForValue((DISPID_EVENTS + 151), "ontimeupdate");
239  AxIdMap.setIdForValue((DISPID_EVENTS + 152), "onvolumechange");
240  AxIdMap.setIdForValue((DISPID_EVENTS + 153), "onwaiting");
241 
242  AxIdMap.setIdForValue(0, "value");
243  AxIdMap.setIdForValue(-1, "toString");
244  AxIdMap.setIdForValue(-3, "propertyput");
245  AxIdMap.setIdForValue(-4, "newenum");
246  AxIdMap.setIdForValue(-5, "evaluate");
247  AxIdMap.setIdForValue(-6, "constructor");
248  AxIdMap.setIdForValue(-7, "destructor");
249  AxIdMap.setIdForValue(-8, "collect");
250  AxIdMap.setIdForValue(-500, "autosize");
251  AxIdMap.setIdForValue(-501, "backcolor");
252  AxIdMap.setIdForValue(-502, "backstyle");
253  AxIdMap.setIdForValue(-503, "bordercolor");
254  AxIdMap.setIdForValue(-504, "borderstyle");
255  AxIdMap.setIdForValue(-505, "borderwidth");
256  AxIdMap.setIdForValue(-507, "drawmode");
257  AxIdMap.setIdForValue(-508, "drawstyle");
258  AxIdMap.setIdForValue(-509, "drawwidth");
259  AxIdMap.setIdForValue(-510, "fillcolor");
260  AxIdMap.setIdForValue(-511, "fillstyle");
261  AxIdMap.setIdForValue(-512, "font");
262  AxIdMap.setIdForValue(-513, "forecolor");
263  AxIdMap.setIdForValue(-514, "enabled");
264  AxIdMap.setIdForValue(-515, "hwnd");
265  AxIdMap.setIdForValue(-516, "tabstop");
266  AxIdMap.setIdForValue(-517, "text");
267  AxIdMap.setIdForValue(-518, "caption");
268  AxIdMap.setIdForValue(-519, "bordervisible");
269  AxIdMap.setIdForValue(-520, "appearance");
270  AxIdMap.setIdForValue(-521, "mousepointer");
271  AxIdMap.setIdForValue(-522, "mouseicon");
272  AxIdMap.setIdForValue(-523, "picture");
273  AxIdMap.setIdForValue(-524, "valid");
274  AxIdMap.setIdForValue(-525, "readystate");
275  AxIdMap.setIdForValue(-526, "listindex");
276  AxIdMap.setIdForValue(-527, "selected");
277  AxIdMap.setIdForValue(-528, "list");
278  AxIdMap.setIdForValue(-529, "column");
279  AxIdMap.setIdForValue(-531, "listcount");
280  AxIdMap.setIdForValue(-532, "multiselect");
281  AxIdMap.setIdForValue(-533, "maxlength");
282  AxIdMap.setIdForValue(-534, "passwordchar");
283  AxIdMap.setIdForValue(-535, "scrollbars");
284  AxIdMap.setIdForValue(-536, "wordwrap");
285  AxIdMap.setIdForValue(-537, "multiline");
286  AxIdMap.setIdForValue(-538, "numberofrows");
287  AxIdMap.setIdForValue(-539, "numberofcolumns");
288  AxIdMap.setIdForValue(-540, "displaystyle");
289  AxIdMap.setIdForValue(-541, "groupname");
290  AxIdMap.setIdForValue(-542, "imemode");
291  AxIdMap.setIdForValue(-543, "accelerator");
292  AxIdMap.setIdForValue(-544, "enterkeybehavior");
293  AxIdMap.setIdForValue(-545, "tabkeybehavior");
294  AxIdMap.setIdForValue(-546, "seltext");
295  AxIdMap.setIdForValue(-547, "selstart");
296  AxIdMap.setIdForValue(-548, "sellength");
297 
298  AxIdMap.setIdForValue(-550, "refresh");
299  AxIdMap.setIdForValue(-551, "doclick");
300  AxIdMap.setIdForValue(-552, "aboutbox");
301  AxIdMap.setIdForValue(-553, "additem");
302  AxIdMap.setIdForValue(-554, "clear");
303  AxIdMap.setIdForValue(-555, "removeitem");
304  AxIdMap.setIdForValue(-600, "click");
305  AxIdMap.setIdForValue(-601, "dblclick");
306  AxIdMap.setIdForValue(-602, "keydown");
307  AxIdMap.setIdForValue(-603, "keypress");
308  AxIdMap.setIdForValue(-604, "keyup");
309  AxIdMap.setIdForValue(-605, "mousedown");
310  AxIdMap.setIdForValue(-606, "mousemove");
311  AxIdMap.setIdForValue(-607, "mouseup");
312  AxIdMap.setIdForValue(-608, "errorevent");
313  AxIdMap.setIdForValue(-609, "readystatechange");
314  AxIdMap.setIdForValue(-610, "click_value");
315  AxIdMap.setIdForValue(-611, "righttoleft");
316  AxIdMap.setIdForValue(-612, "toptobottom");
317  AxIdMap.setIdForValue(-613, "this");
318  AxIdMap.setIdForValue(-701, "ambient_backcolor");
319  AxIdMap.setIdForValue(-702, "ambient_displayname");
320  AxIdMap.setIdForValue(-703, "ambient_font");
321  AxIdMap.setIdForValue(-704, "ambient_forecolor");
322  AxIdMap.setIdForValue(-705, "ambient_localeid");
323  AxIdMap.setIdForValue(-706, "ambient_messagereflect");
324  AxIdMap.setIdForValue(-707, "ambient_scaleunits");
325  AxIdMap.setIdForValue(-708, "ambient_textalign");
326  AxIdMap.setIdForValue(-709, "ambient_usermode");
327  AxIdMap.setIdForValue(-710, "ambient_uidead");
328  AxIdMap.setIdForValue(-711, "ambient_showgrabhandles");
329  AxIdMap.setIdForValue(-712, "ambient_showhatching");
330  AxIdMap.setIdForValue(-713, "ambient_displayasdefault");
331  AxIdMap.setIdForValue(-714, "ambient_supportsmnemonics");
332  AxIdMap.setIdForValue(-715, "ambient_autoclip");
333  AxIdMap.setIdForValue(-716, "ambient_appearance");
334  AxIdMap.setIdForValue(-725, "ambient_codepage");
335  AxIdMap.setIdForValue(-726, "ambient_palette");
336  AxIdMap.setIdForValue(-727, "ambient_charsetidforvalue");
337  AxIdMap.setIdForValue(-728, "ambient_transferpriority");
338  AxIdMap.setIdForValue(-732, "ambient_righttoleft");
339  AxIdMap.setIdForValue(-733, "ambient_toptobottom");
340  AxIdMap.setIdForValue(-800, "name");
341  AxIdMap.setIdForValue(-801, "delete");
342  AxIdMap.setIdForValue(-802, "object");
343  AxIdMap.setIdForValue(-803, "parent");
344  AxIdMap.setIdForValue(-5500, "windowobject");
345  AxIdMap.setIdForValue(-5506, "locationobject");
346  AxIdMap.setIdForValue(-5507, "historyobject");
347  AxIdMap.setIdForValue(-5508, "navigatorobject");
348  AxIdMap.setIdForValue(-5511, "securityctx");
349  AxIdMap.setIdForValue(-5512, "ambient_dlcontrol");
350  AxIdMap.setIdForValue(-5513, "ambient_useragent");
351  AxIdMap.setIdForValue(-5514, "securitydomain");
352  }
353 };
354 
355 #undef DISPID_EVENTS
356 
357 FB::TypeIDMap<DISPID> FB::ActiveX::AxIdMap(100);
358 AxIdMapInit __AxIdInitClassDummy;
359 
Bidirectional map between an identifier and a variant.
Definition: TypeIDMap.h:33