msxml3: Release IDispatchEx dynamic data properly.
[wine] / dlls / vbscript / global.c
1 /*
2  * Copyright 2011 Jacek Caban for CodeWeavers
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18
19 #include <assert.h>
20
21 #include "vbscript.h"
22 #include "vbscript_defs.h"
23
24 #include "mshtmhst.h"
25 #include "objsafe.h"
26
27 #include "wine/debug.h"
28
29 WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
30
31 #define VB_E_CANNOT_CREATE_OBJ 0x800a01ad
32
33 /* Defined as extern in urlmon.idl, but not exported by uuid.lib */
34 const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY =
35     {0x10200490,0xfa38,0x11d0,{0xac,0x0e,0x00,0xa0,0xc9,0xf,0xff,0xc0}};
36
37 static IInternetHostSecurityManager *get_sec_mgr(script_ctx_t *ctx)
38 {
39     IInternetHostSecurityManager *secmgr;
40     IServiceProvider *sp;
41     HRESULT hres;
42
43     if(!ctx->site)
44         return NULL;
45
46     if(ctx->secmgr)
47         return ctx->secmgr;
48
49     hres = IActiveScriptSite_QueryInterface(ctx->site, &IID_IServiceProvider, (void**)&sp);
50     if(FAILED(hres))
51         return NULL;
52
53     hres = IServiceProvider_QueryService(sp, &SID_SInternetHostSecurityManager, &IID_IInternetHostSecurityManager,
54             (void**)&secmgr);
55     IServiceProvider_Release(sp);
56     if(FAILED(hres))
57         return NULL;
58
59     return ctx->secmgr = secmgr;
60 }
61
62 static HRESULT return_bstr(VARIANT *res, const WCHAR *str)
63 {
64     BSTR ret;
65
66     if(!res)
67         return S_OK;
68
69     ret = SysAllocString(str);
70     if(!ret)
71         return E_OUTOFMEMORY;
72
73     V_VT(res) = VT_BSTR;
74     V_BSTR(res) = ret;
75     return S_OK;
76 }
77
78 static HRESULT return_short(VARIANT *res, short val)
79 {
80     if(res) {
81         V_VT(res) = VT_I2;
82         V_I2(res) = val;
83     }
84
85     return S_OK;
86 }
87
88 static IUnknown *create_object(script_ctx_t *ctx, const WCHAR *progid)
89 {
90     IInternetHostSecurityManager *secmgr = NULL;
91     IObjectWithSite *obj_site;
92     struct CONFIRMSAFETY cs;
93     IClassFactoryEx *cfex;
94     IClassFactory *cf;
95     DWORD policy_size;
96     BYTE *bpolicy;
97     IUnknown *obj;
98     DWORD policy;
99     GUID guid;
100     HRESULT hres;
101
102     hres = CLSIDFromProgID(progid, &guid);
103     if(FAILED(hres))
104         return NULL;
105
106     TRACE("GUID %s\n", debugstr_guid(&guid));
107
108     if(ctx->safeopt & INTERFACE_USES_SECURITY_MANAGER) {
109         secmgr = get_sec_mgr(ctx);
110         if(!secmgr)
111             return NULL;
112
113         policy = 0;
114         hres = IInternetHostSecurityManager_ProcessUrlAction(secmgr, URLACTION_ACTIVEX_RUN,
115                 (BYTE*)&policy, sizeof(policy), (BYTE*)&guid, sizeof(GUID), 0, 0);
116         if(FAILED(hres) || policy != URLPOLICY_ALLOW)
117             return NULL;
118     }
119
120     hres = CoGetClassObject(&guid, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, NULL, &IID_IClassFactory, (void**)&cf);
121     if(FAILED(hres))
122         return NULL;
123
124     hres = IClassFactory_QueryInterface(cf, &IID_IClassFactoryEx, (void**)&cfex);
125     if(SUCCEEDED(hres)) {
126         FIXME("Use IClassFactoryEx\n");
127         IClassFactoryEx_Release(cfex);
128     }
129
130     hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&obj);
131     if(FAILED(hres))
132         return NULL;
133
134     if(secmgr) {
135         cs.clsid = guid;
136         cs.pUnk = obj;
137         cs.dwFlags = 0;
138         hres = IInternetHostSecurityManager_QueryCustomPolicy(secmgr, &GUID_CUSTOM_CONFIRMOBJECTSAFETY,
139                 &bpolicy, &policy_size, (BYTE*)&cs, sizeof(cs), 0);
140         if(SUCCEEDED(hres)) {
141             policy = policy_size >= sizeof(DWORD) ? *(DWORD*)bpolicy : URLPOLICY_DISALLOW;
142             CoTaskMemFree(bpolicy);
143         }
144
145         if(FAILED(hres) || policy != URLPOLICY_ALLOW) {
146             IUnknown_Release(obj);
147             return NULL;
148         }
149     }
150
151     hres = IUnknown_QueryInterface(obj, &IID_IObjectWithSite, (void**)&obj_site);
152     if(SUCCEEDED(hres)) {
153         IUnknown *ax_site;
154
155         ax_site = create_ax_site(ctx);
156         if(ax_site) {
157             hres = IObjectWithSite_SetSite(obj_site, ax_site);
158             IUnknown_Release(ax_site);
159         }
160         IObjectWithSite_Release(obj_site);
161         if(!ax_site || FAILED(hres)) {
162             IUnknown_Release(obj);
163             return NULL;
164         }
165     }
166
167     return obj;
168 }
169
170 static HRESULT Global_CCur(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
171 {
172     FIXME("\n");
173     return E_NOTIMPL;
174 }
175
176 static HRESULT Global_CInt(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
177 {
178     FIXME("\n");
179     return E_NOTIMPL;
180 }
181
182 static HRESULT Global_CLng(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
183 {
184     FIXME("\n");
185     return E_NOTIMPL;
186 }
187
188 static HRESULT Global_CBool(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
189 {
190     FIXME("\n");
191     return E_NOTIMPL;
192 }
193
194 static HRESULT Global_CByte(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
195 {
196     FIXME("\n");
197     return E_NOTIMPL;
198 }
199
200 static HRESULT Global_CDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
201 {
202     FIXME("\n");
203     return E_NOTIMPL;
204 }
205
206 static HRESULT Global_CDbl(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
207 {
208     FIXME("\n");
209     return E_NOTIMPL;
210 }
211
212 static HRESULT Global_CSng(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
213 {
214     FIXME("\n");
215     return E_NOTIMPL;
216 }
217
218 static HRESULT Global_CStr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
219 {
220     FIXME("\n");
221     return E_NOTIMPL;
222 }
223
224 static inline WCHAR hex_char(unsigned n)
225 {
226     return n < 10 ? '0'+n : 'A'+n-10;
227 }
228
229 static HRESULT Global_Hex(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
230 {
231     WCHAR buf[17], *ptr;
232     DWORD n;
233
234     TRACE("%s\n", debugstr_variant(arg));
235
236     switch(V_VT(arg)) {
237     case VT_I2:
238         n = (WORD)V_I2(arg);
239         break;
240     case VT_I4:
241         n = V_I4(arg);
242         break;
243     case VT_EMPTY:
244         n = 0;
245         break;
246     case VT_NULL:
247         if(res)
248             V_VT(res) = VT_NULL;
249         return S_OK;
250     default:
251         FIXME("unsupported type %s\n", debugstr_variant(arg));
252         return E_NOTIMPL;
253     }
254
255     buf[16] = 0;
256     ptr = buf+15;
257
258     if(n) {
259         do {
260             *ptr-- = hex_char(n & 0xf);
261             n >>= 4;
262         }while(n);
263         ptr++;
264     }else {
265         *ptr = '0';
266     }
267
268     return return_bstr(res, ptr);
269 }
270
271 static HRESULT Global_Oct(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
272 {
273     FIXME("\n");
274     return E_NOTIMPL;
275 }
276
277 static HRESULT Global_VarType(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
278 {
279     FIXME("\n");
280     return E_NOTIMPL;
281 }
282
283 static HRESULT Global_IsDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
284 {
285     FIXME("\n");
286     return E_NOTIMPL;
287 }
288
289 static HRESULT Global_IsEmpty(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
290 {
291     TRACE("(%s)\n", debugstr_variant(arg));
292
293     assert(args_cnt == 1);
294
295     if(res) {
296         V_VT(res) = VT_BOOL;
297         V_BOOL(res) = V_VT(arg) == VT_EMPTY ? VARIANT_TRUE : VARIANT_FALSE;
298     }
299     return S_OK;
300 }
301
302 static HRESULT Global_IsNull(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
303 {
304     TRACE("(%s)\n", debugstr_variant(arg));
305
306     assert(args_cnt == 1);
307
308     if(res) {
309         V_VT(res) = VT_BOOL;
310         V_BOOL(res) = V_VT(arg) == VT_NULL ? VARIANT_TRUE : VARIANT_FALSE;
311     }
312     return S_OK;
313 }
314
315 static HRESULT Global_IsNumeric(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
316 {
317     FIXME("\n");
318     return E_NOTIMPL;
319 }
320
321 static HRESULT Global_IsArray(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
322 {
323     FIXME("\n");
324     return E_NOTIMPL;
325 }
326
327 static HRESULT Global_IsObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
328 {
329     TRACE("(%s)\n", debugstr_variant(arg));
330
331     assert(args_cnt == 1);
332
333     if(res) {
334         V_VT(res) = VT_BOOL;
335         V_BOOL(res) = V_VT(arg) == VT_DISPATCH ? VARIANT_TRUE : VARIANT_FALSE;
336     }
337     return S_OK;
338 }
339
340 static HRESULT Global_Ant(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
341 {
342     FIXME("\n");
343     return E_NOTIMPL;
344 }
345
346 static HRESULT Global_Cos(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
347 {
348     FIXME("\n");
349     return E_NOTIMPL;
350 }
351
352 static HRESULT Global_Sin(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
353 {
354     FIXME("\n");
355     return E_NOTIMPL;
356 }
357
358 static HRESULT Global_Tan(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
359 {
360     FIXME("\n");
361     return E_NOTIMPL;
362 }
363
364 static HRESULT Global_Exp(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
365 {
366     FIXME("\n");
367     return E_NOTIMPL;
368 }
369
370 static HRESULT Global_Log(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
371 {
372     FIXME("\n");
373     return E_NOTIMPL;
374 }
375
376 static HRESULT Global_Sqr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
377 {
378     FIXME("\n");
379     return E_NOTIMPL;
380 }
381
382 static HRESULT Global_Randomize(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
383 {
384     FIXME("\n");
385     return E_NOTIMPL;
386 }
387
388 static HRESULT Global_Rnd(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
389 {
390     FIXME("\n");
391     return E_NOTIMPL;
392 }
393
394 static HRESULT Global_Timer(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
395 {
396     FIXME("\n");
397     return E_NOTIMPL;
398 }
399
400 static HRESULT Global_LBound(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
401 {
402     FIXME("\n");
403     return E_NOTIMPL;
404 }
405
406 static HRESULT Global_UBound(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
407 {
408     FIXME("\n");
409     return E_NOTIMPL;
410 }
411
412 static HRESULT Global_RGB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
413 {
414     FIXME("\n");
415     return E_NOTIMPL;
416 }
417
418 static HRESULT Global_Len(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
419 {
420     FIXME("\n");
421     return E_NOTIMPL;
422 }
423
424 static HRESULT Global_LenB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
425 {
426     FIXME("\n");
427     return E_NOTIMPL;
428 }
429
430 static HRESULT Global_Left(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
431 {
432     FIXME("\n");
433     return E_NOTIMPL;
434 }
435
436 static HRESULT Global_LeftB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
437 {
438     FIXME("\n");
439     return E_NOTIMPL;
440 }
441
442 static HRESULT Global_Right(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
443 {
444     FIXME("\n");
445     return E_NOTIMPL;
446 }
447
448 static HRESULT Global_RightB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
449 {
450     FIXME("\n");
451     return E_NOTIMPL;
452 }
453
454 static HRESULT Global_Mid(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
455 {
456     FIXME("\n");
457     return E_NOTIMPL;
458 }
459
460 static HRESULT Global_MidB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
461 {
462     FIXME("\n");
463     return E_NOTIMPL;
464 }
465
466 static HRESULT Global_StrComp(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
467 {
468     FIXME("\n");
469     return E_NOTIMPL;
470 }
471
472 static HRESULT Global_LCase(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
473 {
474     FIXME("\n");
475     return E_NOTIMPL;
476 }
477
478 static HRESULT Global_UCase(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
479 {
480     FIXME("\n");
481     return E_NOTIMPL;
482 }
483
484 static HRESULT Global_LTrim(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
485 {
486     FIXME("\n");
487     return E_NOTIMPL;
488 }
489
490 static HRESULT Global_RTrim(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
491 {
492     FIXME("\n");
493     return E_NOTIMPL;
494 }
495
496 static HRESULT Global_Trim(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
497 {
498     FIXME("\n");
499     return E_NOTIMPL;
500 }
501
502 static HRESULT Global_Space(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
503 {
504     FIXME("\n");
505     return E_NOTIMPL;
506 }
507
508 static HRESULT Global_String(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
509 {
510     FIXME("\n");
511     return E_NOTIMPL;
512 }
513
514 static HRESULT Global_InStr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
515 {
516     FIXME("\n");
517     return E_NOTIMPL;
518 }
519
520 static HRESULT Global_InStrB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
521 {
522     FIXME("\n");
523     return E_NOTIMPL;
524 }
525
526 static HRESULT Global_AscB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
527 {
528     FIXME("\n");
529     return E_NOTIMPL;
530 }
531
532 static HRESULT Global_ChrB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
533 {
534     FIXME("\n");
535     return E_NOTIMPL;
536 }
537
538 static HRESULT Global_Asc(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
539 {
540     FIXME("\n");
541     return E_NOTIMPL;
542 }
543
544 static HRESULT Global_Chr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
545 {
546     FIXME("\n");
547     return E_NOTIMPL;
548 }
549
550 static HRESULT Global_AscW(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
551 {
552     FIXME("\n");
553     return E_NOTIMPL;
554 }
555
556 static HRESULT Global_ChrW(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
557 {
558     FIXME("\n");
559     return E_NOTIMPL;
560 }
561
562 static HRESULT Global_Abs(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
563 {
564     FIXME("\n");
565     return E_NOTIMPL;
566 }
567
568 static HRESULT Global_Fix(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
569 {
570     FIXME("\n");
571     return E_NOTIMPL;
572 }
573
574 static HRESULT Global_Int(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
575 {
576     FIXME("\n");
577     return E_NOTIMPL;
578 }
579
580 static HRESULT Global_Sgn(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
581 {
582     FIXME("\n");
583     return E_NOTIMPL;
584 }
585
586 static HRESULT Global_Now(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
587 {
588     FIXME("\n");
589     return E_NOTIMPL;
590 }
591
592 static HRESULT Global_Date(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
593 {
594     FIXME("\n");
595     return E_NOTIMPL;
596 }
597
598 static HRESULT Global_Time(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
599 {
600     FIXME("\n");
601     return E_NOTIMPL;
602 }
603
604 static HRESULT Global_Day(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
605 {
606     FIXME("\n");
607     return E_NOTIMPL;
608 }
609
610 static HRESULT Global_Month(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
611 {
612     FIXME("\n");
613     return E_NOTIMPL;
614 }
615
616 static HRESULT Global_Weekday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
617 {
618     FIXME("\n");
619     return E_NOTIMPL;
620 }
621
622 static HRESULT Global_Year(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
623 {
624     FIXME("\n");
625     return E_NOTIMPL;
626 }
627
628 static HRESULT Global_Hour(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
629 {
630     FIXME("\n");
631     return E_NOTIMPL;
632 }
633
634 static HRESULT Global_Minute(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
635 {
636     FIXME("\n");
637     return E_NOTIMPL;
638 }
639
640 static HRESULT Global_Second(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
641 {
642     FIXME("\n");
643     return E_NOTIMPL;
644 }
645
646 static HRESULT Global_DateValue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
647 {
648     FIXME("\n");
649     return E_NOTIMPL;
650 }
651
652 static HRESULT Global_TimeValue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
653 {
654     FIXME("\n");
655     return E_NOTIMPL;
656 }
657
658 static HRESULT Global_DateSerial(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
659 {
660     FIXME("\n");
661     return E_NOTIMPL;
662 }
663
664 static HRESULT Global_TimeSerial(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
665 {
666     FIXME("\n");
667     return E_NOTIMPL;
668 }
669
670 static HRESULT Global_InputBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
671 {
672     FIXME("\n");
673     return E_NOTIMPL;
674 }
675
676 static HRESULT Global_MsgBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
677 {
678     FIXME("\n");
679     return E_NOTIMPL;
680 }
681
682 static HRESULT Global_CreateObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
683 {
684     IUnknown *obj;
685     HRESULT hres;
686
687     TRACE("(%s)\n", debugstr_variant(arg));
688
689     if(V_VT(arg) != VT_BSTR) {
690         FIXME("non-bstr arg\n");
691         return E_INVALIDARG;
692     }
693
694     obj = create_object(This->desc->ctx, V_BSTR(arg));
695     if(!obj)
696         return VB_E_CANNOT_CREATE_OBJ;
697
698     if(res) {
699         hres = IUnknown_QueryInterface(obj, &IID_IDispatch, (void**)&V_DISPATCH(res));
700         if(FAILED(hres))
701             return hres;
702
703         V_VT(res) = VT_DISPATCH;
704     }
705
706     IUnknown_Release(obj);
707     return S_OK;
708 }
709
710 static HRESULT Global_GetObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
711 {
712     FIXME("\n");
713     return E_NOTIMPL;
714 }
715
716 static HRESULT Global_DateAdd(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
717 {
718     FIXME("\n");
719     return E_NOTIMPL;
720 }
721
722 static HRESULT Global_DateDiff(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
723 {
724     FIXME("\n");
725     return E_NOTIMPL;
726 }
727
728 static HRESULT Global_DatePart(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
729 {
730     FIXME("\n");
731     return E_NOTIMPL;
732 }
733
734 static HRESULT Global_TypeName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
735 {
736     FIXME("\n");
737     return E_NOTIMPL;
738 }
739
740 static HRESULT Global_Array(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
741 {
742     FIXME("\n");
743     return E_NOTIMPL;
744 }
745
746 static HRESULT Global_Erase(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
747 {
748     FIXME("\n");
749     return E_NOTIMPL;
750 }
751
752 static HRESULT Global_Filter(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
753 {
754     FIXME("\n");
755     return E_NOTIMPL;
756 }
757
758 static HRESULT Global_Join(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
759 {
760     FIXME("\n");
761     return E_NOTIMPL;
762 }
763
764 static HRESULT Global_Split(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
765 {
766     FIXME("\n");
767     return E_NOTIMPL;
768 }
769
770 static HRESULT Global_Replace(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
771 {
772     FIXME("\n");
773     return E_NOTIMPL;
774 }
775
776 static HRESULT Global_StrReverse(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
777 {
778     FIXME("\n");
779     return E_NOTIMPL;
780 }
781
782 static HRESULT Global_InStrRev(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
783 {
784     FIXME("\n");
785     return E_NOTIMPL;
786 }
787
788 static HRESULT Global_LoadPicture(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
789 {
790     FIXME("\n");
791     return E_NOTIMPL;
792 }
793
794 static HRESULT Global_ScriptEngine(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
795 {
796     FIXME("\n");
797     return E_NOTIMPL;
798 }
799
800 static HRESULT Global_ScriptEngineMajorVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
801 {
802     FIXME("\n");
803     return E_NOTIMPL;
804 }
805
806 static HRESULT Global_ScriptEngineMinorVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
807 {
808     FIXME("\n");
809     return E_NOTIMPL;
810 }
811
812 static HRESULT Global_ScriptEngineBuildVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
813 {
814     FIXME("\n");
815     return E_NOTIMPL;
816 }
817
818 static HRESULT Global_FormatNumber(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
819 {
820     FIXME("\n");
821     return E_NOTIMPL;
822 }
823
824 static HRESULT Global_FormatCurrency(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
825 {
826     FIXME("\n");
827     return E_NOTIMPL;
828 }
829
830 static HRESULT Global_FormatPercent(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
831 {
832     FIXME("\n");
833     return E_NOTIMPL;
834 }
835
836 static HRESULT Global_FormatDateTime(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
837 {
838     FIXME("\n");
839     return E_NOTIMPL;
840 }
841
842 static HRESULT Global_WeekdayName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
843 {
844     FIXME("\n");
845     return E_NOTIMPL;
846 }
847
848 static HRESULT Global_MonthName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
849 {
850     FIXME("\n");
851     return E_NOTIMPL;
852 }
853
854 static HRESULT Global_Round(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
855 {
856     FIXME("\n");
857     return E_NOTIMPL;
858 }
859
860 static HRESULT Global_Escape(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
861 {
862     FIXME("\n");
863     return E_NOTIMPL;
864 }
865
866 static HRESULT Global_Unescape(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
867 {
868     FIXME("\n");
869     return E_NOTIMPL;
870 }
871
872 static HRESULT Global_Eval(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
873 {
874     FIXME("\n");
875     return E_NOTIMPL;
876 }
877
878 static HRESULT Global_Execute(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
879 {
880     FIXME("\n");
881     return E_NOTIMPL;
882 }
883
884 static HRESULT Global_ExecuteGlobal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
885 {
886     FIXME("\n");
887     return E_NOTIMPL;
888 }
889
890 static HRESULT Global_GetRef(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
891 {
892     FIXME("\n");
893     return E_NOTIMPL;
894 }
895
896 static HRESULT Global_vbUseSystem(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
897 {
898     FIXME("\n");
899     return E_NOTIMPL;
900 }
901
902 static HRESULT Global_vbUseSystemDayOfWeek(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
903 {
904     FIXME("\n");
905     return E_NOTIMPL;
906 }
907
908 static HRESULT Global_vbSunday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
909 {
910     TRACE("\n");
911     return return_short(res, 1);
912 }
913
914 static HRESULT Global_vbMonday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
915 {
916     TRACE("\n");
917     return return_short(res, 2);
918 }
919
920 static HRESULT Global_vbTuesday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
921 {
922     TRACE("\n");
923     return return_short(res, 3);
924 }
925
926 static HRESULT Global_vbWednesday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
927 {
928     TRACE("\n");
929     return return_short(res, 4);
930 }
931
932 static HRESULT Global_vbThursday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
933 {
934     TRACE("\n");
935     return return_short(res, 5);
936 }
937
938 static HRESULT Global_vbFriday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
939 {
940     TRACE("\n");
941     return return_short(res, 6);
942 }
943
944 static HRESULT Global_vbSaturday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
945 {
946     TRACE("\n");
947     return return_short(res, 7);
948 }
949
950 static HRESULT Global_vbFirstJan1(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
951 {
952     FIXME("\n");
953     return E_NOTIMPL;
954 }
955
956 static HRESULT Global_vbFirstFourDays(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
957 {
958     FIXME("\n");
959     return E_NOTIMPL;
960 }
961
962 static HRESULT Global_vbFirstFullWeek(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
963 {
964     FIXME("\n");
965     return E_NOTIMPL;
966 }
967
968 static HRESULT Global_vbOKOnly(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
969 {
970     FIXME("\n");
971     return E_NOTIMPL;
972 }
973
974 static HRESULT Global_vbOKCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
975 {
976     FIXME("\n");
977     return E_NOTIMPL;
978 }
979
980 static HRESULT Global_vbAbortRetryIgnore(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
981 {
982     FIXME("\n");
983     return E_NOTIMPL;
984 }
985
986 static HRESULT Global_vbYesNoCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
987 {
988     FIXME("\n");
989     return E_NOTIMPL;
990 }
991
992 static HRESULT Global_vbYesNo(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
993 {
994     FIXME("\n");
995     return E_NOTIMPL;
996 }
997
998 static HRESULT Global_vbRetryCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
999 {
1000     FIXME("\n");
1001     return E_NOTIMPL;
1002 }
1003
1004 static HRESULT Global_vbCritical(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1005 {
1006     FIXME("\n");
1007     return E_NOTIMPL;
1008 }
1009
1010 static HRESULT Global_vbQuestion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1011 {
1012     FIXME("\n");
1013     return E_NOTIMPL;
1014 }
1015
1016 static HRESULT Global_vbExclamation(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1017 {
1018     FIXME("\n");
1019     return E_NOTIMPL;
1020 }
1021
1022 static HRESULT Global_vbInformation(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1023 {
1024     FIXME("\n");
1025     return E_NOTIMPL;
1026 }
1027
1028 static HRESULT Global_vbDefaultButton1(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1029 {
1030     FIXME("\n");
1031     return E_NOTIMPL;
1032 }
1033
1034 static HRESULT Global_vbDefaultButton2(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1035 {
1036     FIXME("\n");
1037     return E_NOTIMPL;
1038 }
1039
1040 static HRESULT Global_vbDefaultButton3(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1041 {
1042     FIXME("\n");
1043     return E_NOTIMPL;
1044 }
1045
1046 static HRESULT Global_vbDefaultButton4(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1047 {
1048     FIXME("\n");
1049     return E_NOTIMPL;
1050 }
1051
1052 static HRESULT Global_vbApplicationModal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1053 {
1054     FIXME("\n");
1055     return E_NOTIMPL;
1056 }
1057
1058 static HRESULT Global_vbSystemModal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1059 {
1060     FIXME("\n");
1061     return E_NOTIMPL;
1062 }
1063
1064 static HRESULT Global_vbOK(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1065 {
1066     FIXME("\n");
1067     return E_NOTIMPL;
1068 }
1069
1070 static HRESULT Global_vbCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1071 {
1072     FIXME("\n");
1073     return E_NOTIMPL;
1074 }
1075
1076 static HRESULT Global_vbAbort(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1077 {
1078     FIXME("\n");
1079     return E_NOTIMPL;
1080 }
1081
1082 static HRESULT Global_vbRetry(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1083 {
1084     FIXME("\n");
1085     return E_NOTIMPL;
1086 }
1087
1088 static HRESULT Global_vbIgnore(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1089 {
1090     FIXME("\n");
1091     return E_NOTIMPL;
1092 }
1093
1094 static HRESULT Global_vbYes(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1095 {
1096     FIXME("\n");
1097     return E_NOTIMPL;
1098 }
1099
1100 static HRESULT Global_vbNo(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1101 {
1102     FIXME("\n");
1103     return E_NOTIMPL;
1104 }
1105
1106 static HRESULT Global_vbEmpty(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1107 {
1108     FIXME("\n");
1109     return E_NOTIMPL;
1110 }
1111
1112 static HRESULT Global_vbNull(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1113 {
1114     FIXME("\n");
1115     return E_NOTIMPL;
1116 }
1117
1118 static HRESULT Global_vbInteger(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1119 {
1120     FIXME("\n");
1121     return E_NOTIMPL;
1122 }
1123
1124 static HRESULT Global_vbLong(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1125 {
1126     FIXME("\n");
1127     return E_NOTIMPL;
1128 }
1129
1130 static HRESULT Global_vbSingle(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1131 {
1132     FIXME("\n");
1133     return E_NOTIMPL;
1134 }
1135
1136 static HRESULT Global_vbDouble(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1137 {
1138     FIXME("\n");
1139     return E_NOTIMPL;
1140 }
1141
1142 static HRESULT Global_vbCurrency(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1143 {
1144     FIXME("\n");
1145     return E_NOTIMPL;
1146 }
1147
1148 static HRESULT Global_vbDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1149 {
1150     FIXME("\n");
1151     return E_NOTIMPL;
1152 }
1153
1154 static HRESULT Global_vbString(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1155 {
1156     FIXME("\n");
1157     return E_NOTIMPL;
1158 }
1159
1160 static HRESULT Global_vbObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1161 {
1162     FIXME("\n");
1163     return E_NOTIMPL;
1164 }
1165
1166 static HRESULT Global_vbError(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1167 {
1168     FIXME("\n");
1169     return E_NOTIMPL;
1170 }
1171
1172 static HRESULT Global_vbBoolean(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1173 {
1174     FIXME("\n");
1175     return E_NOTIMPL;
1176 }
1177
1178 static HRESULT Global_vbVariant(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1179 {
1180     FIXME("\n");
1181     return E_NOTIMPL;
1182 }
1183
1184 static HRESULT Global_vbDataObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1185 {
1186     FIXME("\n");
1187     return E_NOTIMPL;
1188 }
1189
1190 static HRESULT Global_vbDecimal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1191 {
1192     FIXME("\n");
1193     return E_NOTIMPL;
1194 }
1195
1196 static HRESULT Global_vbByte(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1197 {
1198     FIXME("\n");
1199     return E_NOTIMPL;
1200 }
1201
1202 static HRESULT Global_vbArray(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1203 {
1204     FIXME("\n");
1205     return E_NOTIMPL;
1206 }
1207
1208 static HRESULT Global_vbTrue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1209 {
1210     FIXME("\n");
1211     return E_NOTIMPL;
1212 }
1213
1214 static HRESULT Global_vbFalse(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1215 {
1216     FIXME("\n");
1217     return E_NOTIMPL;
1218 }
1219
1220 static HRESULT Global_vbUseDefault(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1221 {
1222     FIXME("\n");
1223     return E_NOTIMPL;
1224 }
1225
1226 static HRESULT Global_vbBinaryCompare(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1227 {
1228     FIXME("\n");
1229     return E_NOTIMPL;
1230 }
1231
1232 static HRESULT Global_vbTextCompare(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1233 {
1234     FIXME("\n");
1235     return E_NOTIMPL;
1236 }
1237
1238 static HRESULT Global_vbDatabaseCompare(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1239 {
1240     FIXME("\n");
1241     return E_NOTIMPL;
1242 }
1243
1244 static HRESULT Global_vbGeneralDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1245 {
1246     FIXME("\n");
1247     return E_NOTIMPL;
1248 }
1249
1250 static HRESULT Global_vbLongDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1251 {
1252     FIXME("\n");
1253     return E_NOTIMPL;
1254 }
1255
1256 static HRESULT Global_vbShortDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1257 {
1258     FIXME("\n");
1259     return E_NOTIMPL;
1260 }
1261
1262 static HRESULT Global_vbLongTime(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1263 {
1264     FIXME("\n");
1265     return E_NOTIMPL;
1266 }
1267
1268 static HRESULT Global_vbShortTime(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1269 {
1270     FIXME("\n");
1271     return E_NOTIMPL;
1272 }
1273
1274 static HRESULT Global_vbObjectError(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1275 {
1276     FIXME("\n");
1277     return E_NOTIMPL;
1278 }
1279
1280 static HRESULT Global_vbBlack(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1281 {
1282     FIXME("\n");
1283     return E_NOTIMPL;
1284 }
1285
1286 static HRESULT Global_vbBlue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1287 {
1288     FIXME("\n");
1289     return E_NOTIMPL;
1290 }
1291
1292 static HRESULT Global_vbCyan(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1293 {
1294     FIXME("\n");
1295     return E_NOTIMPL;
1296 }
1297
1298 static HRESULT Global_vbGreen(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1299 {
1300     FIXME("\n");
1301     return E_NOTIMPL;
1302 }
1303
1304 static HRESULT Global_vbMagenta(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1305 {
1306     FIXME("\n");
1307     return E_NOTIMPL;
1308 }
1309
1310 static HRESULT Global_vbRed(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1311 {
1312     FIXME("\n");
1313     return E_NOTIMPL;
1314 }
1315
1316 static HRESULT Global_vbWhite(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1317 {
1318     FIXME("\n");
1319     return E_NOTIMPL;
1320 }
1321
1322 static HRESULT Global_vbYellow(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1323 {
1324     FIXME("\n");
1325     return E_NOTIMPL;
1326 }
1327
1328 static HRESULT Global_vbCr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1329 {
1330     FIXME("\n");
1331     return E_NOTIMPL;
1332 }
1333
1334 static HRESULT Global_vbCrLf(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1335 {
1336     FIXME("\n");
1337     return E_NOTIMPL;
1338 }
1339
1340 static HRESULT Global_vbNewLine(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1341 {
1342     FIXME("\n");
1343     return E_NOTIMPL;
1344 }
1345
1346 static HRESULT Global_vbFormFeed(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1347 {
1348     FIXME("\n");
1349     return E_NOTIMPL;
1350 }
1351
1352 static HRESULT Global_vbLf(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1353 {
1354     FIXME("\n");
1355     return E_NOTIMPL;
1356 }
1357
1358 static HRESULT Global_vbNullChar(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1359 {
1360     FIXME("\n");
1361     return E_NOTIMPL;
1362 }
1363
1364 static HRESULT Global_vbNullString(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1365 {
1366     FIXME("\n");
1367     return E_NOTIMPL;
1368 }
1369
1370 static HRESULT Global_vbTab(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1371 {
1372     FIXME("\n");
1373     return E_NOTIMPL;
1374 }
1375
1376 static HRESULT Global_vbVerticalTab(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1377 {
1378     FIXME("\n");
1379     return E_NOTIMPL;
1380 }
1381
1382 static HRESULT Global_vbMsgBoxHelpButton(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1383 {
1384     FIXME("\n");
1385     return E_NOTIMPL;
1386 }
1387
1388 static HRESULT Global_vbMsgBoxSetForeground(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1389 {
1390     FIXME("\n");
1391     return E_NOTIMPL;
1392 }
1393
1394 static HRESULT Global_vbMsgBoxRight(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1395 {
1396     FIXME("\n");
1397     return E_NOTIMPL;
1398 }
1399
1400 static HRESULT Global_vbMsgBoxRtlReading(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1401 {
1402     FIXME("\n");
1403     return E_NOTIMPL;
1404 }
1405
1406 static const builtin_prop_t global_props[] = {
1407     {DISPID_GLOBAL_VBUSESYSTEM,        Global_vbUseSystem, BP_GET},
1408     {DISPID_GLOBAL_USESYSTEMDAYOFWEEK, Global_vbUseSystemDayOfWeek, BP_GET},
1409     {DISPID_GLOBAL_VBSUNDAY,           Global_vbSunday, BP_GET},
1410     {DISPID_GLOBAL_VBMONDAY,           Global_vbMonday, BP_GET},
1411     {DISPID_GLOBAL_VBTUESDAY,          Global_vbTuesday, BP_GET},
1412     {DISPID_GLOBAL_VBWEDNESDAY,        Global_vbWednesday, BP_GET},
1413     {DISPID_GLOBAL_VBTHURSDAY,         Global_vbThursday, BP_GET},
1414     {DISPID_GLOBAL_VBFRIDAY,           Global_vbFriday, BP_GET},
1415     {DISPID_GLOBAL_VBSATURDAY,         Global_vbSaturday, BP_GET},
1416     {DISPID_GLOBAL_VBFIRSTJAN1,        Global_vbFirstJan1, BP_GET},
1417     {DISPID_GLOBAL_VBFIRSTFOURDAYS,    Global_vbFirstFourDays, BP_GET},
1418     {DISPID_GLOBAL_VBFIRSTFULLWEEK,    Global_vbFirstFullWeek, BP_GET},
1419     {DISPID_GLOBAL_VBOKONLY,           Global_vbOKOnly, BP_GET},
1420     {DISPID_GLOBAL_VBOKCANCEL,         Global_vbOKCancel, BP_GET},
1421     {DISPID_GLOBAL_VBABORTRETRYIGNORE, Global_vbAbortRetryIgnore, BP_GET},
1422     {DISPID_GLOBAL_VBYESNOCANCEL,      Global_vbYesNoCancel, BP_GET},
1423     {DISPID_GLOBAL_VBYESNO,            Global_vbYesNo, BP_GET},
1424     {DISPID_GLOBAL_VBRETRYCANCEL,      Global_vbRetryCancel, BP_GET},
1425     {DISPID_GLOBAL_VBCRITICAL,         Global_vbCritical, BP_GET},
1426     {DISPID_GLOBAL_VBQUESTION,         Global_vbQuestion, BP_GET},
1427     {DISPID_GLOBAL_VBEXCLAMATION,      Global_vbExclamation, BP_GET},
1428     {DISPID_GLOBAL_VBINFORMATION,      Global_vbInformation, BP_GET},
1429     {DISPID_GLOBAL_VBDEFAULTBUTTON1,   Global_vbDefaultButton1, BP_GET},
1430     {DISPID_GLOBAL_VBDEFAULTBUTTON2,   Global_vbDefaultButton2, BP_GET},
1431     {DISPID_GLOBAL_VBDEFAULTBUTTON3,   Global_vbDefaultButton3, BP_GET},
1432     {DISPID_GLOBAL_VBDEFAULTBUTTON4,   Global_vbDefaultButton4, BP_GET},
1433     {DISPID_GLOBAL_VBAPPLICATIONMODAL, Global_vbApplicationModal, BP_GET},
1434     {DISPID_GLOBAL_VBSYSTEMMODAL,      Global_vbSystemModal, BP_GET},
1435     {DISPID_GLOBAL_VBOK,               Global_vbOK, BP_GET},
1436     {DISPID_GLOBAL_VBCANCEL,           Global_vbCancel, BP_GET},
1437     {DISPID_GLOBAL_VBABORT,            Global_vbAbort, BP_GET},
1438     {DISPID_GLOBAL_VBRETRY,            Global_vbRetry, BP_GET},
1439     {DISPID_GLOBAL_VBIGNORE,           Global_vbIgnore, BP_GET},
1440     {DISPID_GLOBAL_VBYES,              Global_vbYes, BP_GET},
1441     {DISPID_GLOBAL_VBNO,               Global_vbNo, BP_GET},
1442     {DISPID_GLOBAL_VBEMPTY,            Global_vbEmpty, BP_GET},
1443     {DISPID_GLOBAL_VBNULL,             Global_vbNull, BP_GET},
1444     {DISPID_GLOBAL_VBINTEGER,          Global_vbInteger, BP_GET},
1445     {DISPID_GLOBAL_VBLONG,             Global_vbLong, BP_GET},
1446     {DISPID_GLOBAL_VBSINGLE,           Global_vbSingle, BP_GET},
1447     {DISPID_GLOBAL_VBDOUBLE,           Global_vbDouble, BP_GET},
1448     {DISPID_GLOBAL_VBCURRENCY,         Global_vbCurrency, BP_GET},
1449     {DISPID_GLOBAL_VBDATE,             Global_vbDate, BP_GET},
1450     {DISPID_GLOBAL_VBSTRING,           Global_vbString, BP_GET},
1451     {DISPID_GLOBAL_VBOBJECT,           Global_vbObject, BP_GET},
1452     {DISPID_GLOBAL_VBERROR,            Global_vbError, BP_GET},
1453     {DISPID_GLOBAL_VBBOOLEAN,          Global_vbBoolean, BP_GET},
1454     {DISPID_GLOBAL_VBVARIANT,          Global_vbVariant, BP_GET},
1455     {DISPID_GLOBAL_VBDATAOBJECT,       Global_vbDataObject, BP_GET},
1456     {DISPID_GLOBAL_VBDECIMAL,          Global_vbDecimal, BP_GET},
1457     {DISPID_GLOBAL_VBBYTE,             Global_vbByte, BP_GET},
1458     {DISPID_GLOBAL_VBARRAY,            Global_vbArray, BP_GET},
1459     {DISPID_GLOBAL_VBTRUE,             Global_vbTrue, BP_GET},
1460     {DISPID_GLOBAL_VBFALSE,            Global_vbFalse, BP_GET},
1461     {DISPID_GLOBAL_VBUSEDEFAULT,       Global_vbUseDefault, BP_GET},
1462     {DISPID_GLOBAL_VBBINARYCOMPARE,    Global_vbBinaryCompare, BP_GET},
1463     {DISPID_GLOBAL_VBTEXTCOMPARE,      Global_vbTextCompare, BP_GET},
1464     {DISPID_GLOBAL_VBDATABASECOMPARE,  Global_vbDatabaseCompare, BP_GET},
1465     {DISPID_GLOBAL_VBGENERALDATE,      Global_vbGeneralDate, BP_GET},
1466     {DISPID_GLOBAL_VBLONGDATE,         Global_vbLongDate, BP_GET},
1467     {DISPID_GLOBAL_VBSHORTDATE,        Global_vbShortDate, BP_GET},
1468     {DISPID_GLOBAL_VBLONGTIME,         Global_vbLongTime, BP_GET},
1469     {DISPID_GLOBAL_VBSHORTTIME,        Global_vbShortTime, BP_GET},
1470     {DISPID_GLOBAL_VBOBJECTERROR,      Global_vbObjectError, BP_GET},
1471     {DISPID_GLOBAL_VBBLACK,            Global_vbBlack, BP_GET},
1472     {DISPID_GLOBAL_VBBLUE,             Global_vbBlue, BP_GET},
1473     {DISPID_GLOBAL_VBCYAN,             Global_vbCyan, BP_GET},
1474     {DISPID_GLOBAL_VBGREEN,            Global_vbGreen, BP_GET},
1475     {DISPID_GLOBAL_VBMAGENTA,          Global_vbMagenta, BP_GET},
1476     {DISPID_GLOBAL_VBRED,              Global_vbRed, BP_GET},
1477     {DISPID_GLOBAL_VBWHITE,            Global_vbWhite, BP_GET},
1478     {DISPID_GLOBAL_VBYELLOW,           Global_vbYellow, BP_GET},
1479     {DISPID_GLOBAL_VBCR,               Global_vbCr, BP_GET},
1480     {DISPID_GLOBAL_VBCRLF,             Global_vbCrLf, BP_GET},
1481     {DISPID_GLOBAL_VBNEWLINE,          Global_vbNewLine, BP_GET},
1482     {DISPID_GLOBAL_VBFORMFEED,         Global_vbFormFeed, BP_GET},
1483     {DISPID_GLOBAL_VBLF,               Global_vbLf, BP_GET},
1484     {DISPID_GLOBAL_VBNULLCHAR,         Global_vbNullChar, BP_GET},
1485     {DISPID_GLOBAL_VBNULLSTRING,       Global_vbNullString, BP_GET},
1486     {DISPID_GLOBAL_VBTAB,              Global_vbTab, BP_GET},
1487     {DISPID_GLOBAL_VBVERTICALTAB,      Global_vbVerticalTab, BP_GET},
1488     {DISPID_GLOBAL_CCUR,                      Global_CCur, 0, 1},
1489     {DISPID_GLOBAL_CINT,                      Global_CInt, 0, 1},
1490     {DISPID_GLOBAL_CLNG,                      Global_CLng, 0, 1},
1491     {DISPID_GLOBAL_CBOOL,                     Global_CBool, 0, 1},
1492     {DISPID_GLOBAL_CBYTE,                     Global_CByte, 0, 1},
1493     {DISPID_GLOBAL_CDATE,                     Global_CDate, 0, 1},
1494     {DISPID_GLOBAL_CDBL,                      Global_CDbl, 0, 1},
1495     {DISPID_GLOBAL_CSNG,                      Global_CSng, 0, 1},
1496     {DISPID_GLOBAL_CSTR,                      Global_CStr, 0, 1},
1497     {DISPID_GLOBAL_HEX,                       Global_Hex, 0, 1},
1498     {DISPID_GLOBAL_OCT,                       Global_Oct, 0, 1},
1499     {DISPID_GLOBAL_VARTYPE,                   Global_VarType, 0, 1},
1500     {DISPID_GLOBAL_ISDATE,                    Global_IsDate, 0, 1},
1501     {DISPID_GLOBAL_ISEMPTY,                   Global_IsEmpty, 0, 1},
1502     {DISPID_GLOBAL_ISNULL,                    Global_IsNull, 0, 1},
1503     {DISPID_GLOBAL_ISNUMERIC,                 Global_IsNumeric, 0, 1},
1504     {DISPID_GLOBAL_ISARRAY,                   Global_IsArray, 0, 1},
1505     {DISPID_GLOBAL_ISOBJECT,                  Global_IsObject, 0, 1},
1506     {DISPID_GLOBAL_ATN,                       Global_Ant, 0, 1},
1507     {DISPID_GLOBAL_COS,                       Global_Cos, 0, 1},
1508     {DISPID_GLOBAL_SIN,                       Global_Sin, 0, 1},
1509     {DISPID_GLOBAL_TAN,                       Global_Tan, 0, 1},
1510     {DISPID_GLOBAL_EXP,                       Global_Exp, 0, 1},
1511     {DISPID_GLOBAL_LOG,                       Global_Log, 0, 1},
1512     {DISPID_GLOBAL_SQR,                       Global_Sqr, 0, 1},
1513     {DISPID_GLOBAL_RANDOMIZE,                 Global_Randomize, 0, 1},
1514     {DISPID_GLOBAL_RND,                       Global_Rnd, 0, 1},
1515     {DISPID_GLOBAL_TIMER,                     Global_Timer, 0, 0},
1516     {DISPID_GLOBAL_LBOUND,                    Global_LBound, 0, 1},
1517     {DISPID_GLOBAL_UBOUND,                    Global_UBound, 0, 1},
1518     {DISPID_GLOBAL_RGB,                       Global_RGB, 0, 3},
1519     {DISPID_GLOBAL_LEN,                       Global_Len, 0, 1},
1520     {DISPID_GLOBAL_LENB,                      Global_LenB, 0, 1},
1521     {DISPID_GLOBAL_LEFT,                      Global_Left, 0, 2},
1522     {DISPID_GLOBAL_LEFTB,                     Global_LeftB, 0, 2},
1523     {DISPID_GLOBAL_RIGHT,                     Global_Right, 0, 2},
1524     {DISPID_GLOBAL_RIGHTB,                    Global_RightB, 0, 2},
1525     {DISPID_GLOBAL_MID,                       Global_Mid, 0, 2, 3},
1526     {DISPID_GLOBAL_MIDB,                      Global_MidB, 0, 2, 3},
1527     {DISPID_GLOBAL_STRCOMP,                   Global_StrComp, 0, 2, 3},
1528     {DISPID_GLOBAL_LCASE,                     Global_LCase, 0, 1},
1529     {DISPID_GLOBAL_UCASE,                     Global_UCase, 0, 1},
1530     {DISPID_GLOBAL_LTRIM,                     Global_LTrim, 0, 1},
1531     {DISPID_GLOBAL_RTRIM,                     Global_RTrim, 0, 1},
1532     {DISPID_GLOBAL_TRIM,                      Global_Trim, 0, 1},
1533     {DISPID_GLOBAL_SPACE,                     Global_Space, 0, 1},
1534     {DISPID_GLOBAL_STRING,                    Global_String, 0, 0, 2},
1535     {DISPID_GLOBAL_INSTR,                     Global_InStr, 0, 3, 4},
1536     {DISPID_GLOBAL_INSTRB,                    Global_InStrB, 0, 3, 4},
1537     {DISPID_GLOBAL_ASCB,                      Global_AscB, 0, 1},
1538     {DISPID_GLOBAL_CHRB,                      Global_ChrB, 0, 1},
1539     {DISPID_GLOBAL_ASC,                       Global_Asc, 0, 1},
1540     {DISPID_GLOBAL_CHR,                       Global_Chr, 0, 1},
1541     {DISPID_GLOBAL_ASCW,                      Global_AscW, 0, 1},
1542     {DISPID_GLOBAL_CHRW,                      Global_ChrW, 0, 1},
1543     {DISPID_GLOBAL_ABS,                       Global_Abs, 0, 1},
1544     {DISPID_GLOBAL_FIX,                       Global_Fix, 0, 1},
1545     {DISPID_GLOBAL_INT,                       Global_Int, 0, 1},
1546     {DISPID_GLOBAL_SGN,                       Global_Sgn, 0, 1},
1547     {DISPID_GLOBAL_NOW,                       Global_Now, 0, 0},
1548     {DISPID_GLOBAL_DATE,                      Global_Date, 0, 0},
1549     {DISPID_GLOBAL_TIME,                      Global_Time, 0, 0},
1550     {DISPID_GLOBAL_DAY,                       Global_Day, 0, 1},
1551     {DISPID_GLOBAL_MONTH,                     Global_Month, 0, 1},
1552     {DISPID_GLOBAL_WEEKDAY,                   Global_Weekday, 0, 1, 2},
1553     {DISPID_GLOBAL_YEAR,                      Global_Year, 0, 1},
1554     {DISPID_GLOBAL_HOUR,                      Global_Hour, 0, 1},
1555     {DISPID_GLOBAL_MINUTE,                    Global_Minute, 0, 1},
1556     {DISPID_GLOBAL_SECOND,                    Global_Second, 0, 1},
1557     {DISPID_GLOBAL_DATEVALUE,                 Global_DateValue, 0, 1},
1558     {DISPID_GLOBAL_TIMEVALUE,                 Global_TimeValue, 0, 1},
1559     {DISPID_GLOBAL_DATESERIAL,                Global_DateSerial, 0, 3},
1560     {DISPID_GLOBAL_TIMESERIAL,                Global_TimeSerial, 0, 3},
1561     {DISPID_GLOBAL_INPUTBOX,                  Global_InputBox, 0, 1, 7},
1562     {DISPID_GLOBAL_MSGBOX,                    Global_MsgBox, 0, 1, 5},
1563     {DISPID_GLOBAL_CREATEOBJECT,              Global_CreateObject, 0, 1},
1564     {DISPID_GLOBAL_GETOBJECT,                 Global_GetObject, 0, 0, 2},
1565     {DISPID_GLOBAL_DATEADD,                   Global_DateAdd, 0, 3},
1566     {DISPID_GLOBAL_DATEDIFF,                  Global_DateDiff, 0, 3, 5},
1567     {DISPID_GLOBAL_DATEPART,                  Global_DatePart, 0, 2, 4},
1568     {DISPID_GLOBAL_TYPENAME,                  Global_TypeName, 0, 1},
1569     {DISPID_GLOBAL_ARRAY,                     Global_Array, 0, 1},
1570     {DISPID_GLOBAL_ERASE,                     Global_Erase, 0, 1},
1571     {DISPID_GLOBAL_FILTER,                    Global_Filter, 0, 2, 4},
1572     {DISPID_GLOBAL_JOIN,                      Global_Join, 0, 1, 2},
1573     {DISPID_GLOBAL_SPLIT,                     Global_Split, 0, 1, 4},
1574     {DISPID_GLOBAL_REPLACE,                   Global_Replace, 0, 3, 6},
1575     {DISPID_GLOBAL_STRREVERSE,                Global_StrReverse, 0, 1},
1576     {DISPID_GLOBAL_INSTRREV,                  Global_InStrRev, 0, 2, 4},
1577     {DISPID_GLOBAL_LOADPICTURE,               Global_LoadPicture, 0, 1},
1578     {DISPID_GLOBAL_SCRIPTENGINE,              Global_ScriptEngine, 0, 0},
1579     {DISPID_GLOBAL_SCRIPTENGINEMAJORVERSION,  Global_ScriptEngineMajorVersion, 0, 0},
1580     {DISPID_GLOBAL_SCRIPTENGINEMINORVERSION,  Global_ScriptEngineMinorVersion, 0, 0},
1581     {DISPID_GLOBAL_SCRIPTENGINEBUILDVERSION,  Global_ScriptEngineBuildVersion, 0, 0},
1582     {DISPID_GLOBAL_FORMATNUMBER,              Global_FormatNumber, 0, 1, 5},
1583     {DISPID_GLOBAL_FORMATCURRENCY,            Global_FormatCurrency, 0, 1, 5},
1584     {DISPID_GLOBAL_FORMATPERCENT,             Global_FormatPercent, 0, 1, 5},
1585     {DISPID_GLOBAL_FORMATDATETIME,            Global_FormatDateTime, 0, 1, 2},
1586     {DISPID_GLOBAL_WEEKDAYNAME,               Global_WeekdayName, 0, 3},
1587     {DISPID_GLOBAL_MONTHNAME,                 Global_MonthName, 0, 1, 2},
1588     {DISPID_GLOBAL_ROUND,                     Global_Round, 0, 1, 2},
1589     {DISPID_GLOBAL_ESCAPE,                    Global_Escape, 0, 1},
1590     {DISPID_GLOBAL_UNESCAPE,                  Global_Unescape, 0, 1},
1591     {DISPID_GLOBAL_EVAL,                      Global_Eval, 0, 1},
1592     {DISPID_GLOBAL_EXECUTE,                   Global_Execute, 0, 1},
1593     {DISPID_GLOBAL_EXECUTEGLOBAL,             Global_ExecuteGlobal, 0, 1},
1594     {DISPID_GLOBAL_GETREF,                    Global_GetRef, 0, 1},
1595     {DISPID_GLOBAL_VBMSGBOXHELPBUTTON,     Global_vbMsgBoxHelpButton, BP_GET},
1596     {DISPID_GLOBAL_VBMSGBOXSETFOREGROUND,  Global_vbMsgBoxSetForeground, BP_GET},
1597     {DISPID_GLOBAL_VBMSGBOXRIGHT,          Global_vbMsgBoxRight, BP_GET},
1598     {DISPID_GLOBAL_VBMSGBOXRTLREADING,     Global_vbMsgBoxRtlReading, BP_GET}
1599 };
1600
1601 HRESULT init_global(script_ctx_t *ctx)
1602 {
1603     HRESULT hres;
1604
1605     ctx->global_desc.ctx = ctx;
1606     ctx->global_desc.builtin_prop_cnt = sizeof(global_props)/sizeof(*global_props);
1607     ctx->global_desc.builtin_props = global_props;
1608
1609     hres = get_typeinfo(GlobalObj_tid, &ctx->global_desc.typeinfo);
1610     if(FAILED(hres))
1611         return hres;
1612
1613     hres = create_vbdisp(&ctx->global_desc, &ctx->global_obj);
1614     if(FAILED(hres))
1615         return hres;
1616
1617     ctx->script_desc.ctx = ctx;
1618     hres = create_vbdisp(&ctx->script_desc, &ctx->script_obj);
1619     if(FAILED(hres))
1620         return hres;
1621
1622     return init_err(ctx);
1623 }