vbscript: Added MsgBox tests.
[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 #include <math.h>
21
22 #include "vbscript.h"
23 #include "vbscript_defs.h"
24
25 #include "mshtmhst.h"
26 #include "objsafe.h"
27
28 #include "wine/debug.h"
29
30 WINE_DEFAULT_DEBUG_CHANNEL(vbscript);
31
32 #define VB_E_CANNOT_CREATE_OBJ 0x800a01ad
33
34 /* Defined as extern in urlmon.idl, but not exported by uuid.lib */
35 const GUID GUID_CUSTOM_CONFIRMOBJECTSAFETY =
36     {0x10200490,0xfa38,0x11d0,{0xac,0x0e,0x00,0xa0,0xc9,0xf,0xff,0xc0}};
37
38 static const WCHAR emptyW[] = {0};
39 static const WCHAR vbscriptW[] = {'V','B','S','c','r','i','p','t',0};
40
41 static IInternetHostSecurityManager *get_sec_mgr(script_ctx_t *ctx)
42 {
43     IInternetHostSecurityManager *secmgr;
44     IServiceProvider *sp;
45     HRESULT hres;
46
47     if(!ctx->site)
48         return NULL;
49
50     if(ctx->secmgr)
51         return ctx->secmgr;
52
53     hres = IActiveScriptSite_QueryInterface(ctx->site, &IID_IServiceProvider, (void**)&sp);
54     if(FAILED(hres))
55         return NULL;
56
57     hres = IServiceProvider_QueryService(sp, &SID_SInternetHostSecurityManager, &IID_IInternetHostSecurityManager,
58             (void**)&secmgr);
59     IServiceProvider_Release(sp);
60     if(FAILED(hres))
61         return NULL;
62
63     return ctx->secmgr = secmgr;
64 }
65
66 static HRESULT return_bstr(VARIANT *res, const WCHAR *str)
67 {
68     BSTR ret;
69
70     if(!res)
71         return S_OK;
72
73     ret = SysAllocString(str);
74     if(!ret)
75         return E_OUTOFMEMORY;
76
77     V_VT(res) = VT_BSTR;
78     V_BSTR(res) = ret;
79     return S_OK;
80 }
81
82 static HRESULT return_short(VARIANT *res, short val)
83 {
84     if(res) {
85         V_VT(res) = VT_I2;
86         V_I2(res) = val;
87     }
88
89     return S_OK;
90 }
91
92 static HRESULT return_int(VARIANT *res, int val)
93 {
94     if((short)val == val)
95         return return_short(res, val);
96
97     if(res) {
98         V_VT(res) = VT_I4;
99         V_I4(res) = val;
100     }
101
102     return S_OK;
103 }
104
105 static inline HRESULT return_double(VARIANT *res, double val)
106 {
107     if(res) {
108         V_VT(res) = VT_R8;
109         V_R8(res) = val;
110     }
111
112     return S_OK;
113 }
114
115 static inline HRESULT return_null(VARIANT *res)
116 {
117     if(res)
118         V_VT(res) = VT_NULL;
119     return S_OK;
120 }
121
122 static HRESULT to_int(VARIANT *v, int *ret)
123 {
124     switch(V_VT(v)) {
125     case VT_I2:
126         *ret = V_I2(v);
127         break;
128     case VT_I4:
129         *ret = V_I4(v);
130         break;
131     case VT_R8: {
132         double n = round(V_R8(v));
133         if(!is_int32(n)) {
134             FIXME("%lf is out of int range\n", n);
135             return E_FAIL;
136         }
137         *ret = n;
138         break;
139     }
140     default:
141         FIXME("not supported %s\n", debugstr_variant(v));
142         return E_NOTIMPL;
143     }
144
145     return S_OK;
146 }
147
148 static HRESULT to_double(VARIANT *v, double *ret)
149 {
150     switch(V_VT(v)) {
151     case VT_I2:
152         *ret = V_I2(v);
153         break;
154     case VT_I4:
155         *ret = V_I4(v);
156         break;
157     case VT_R4:
158         *ret = V_R4(v);
159         break;
160     case VT_R8:
161         *ret = V_R8(v);
162         break;
163     case VT_BSTR: {
164         VARIANT dst;
165         HRESULT hres;
166
167         V_VT(&dst) = VT_EMPTY;
168         hres = VariantChangeType(&dst, v, VARIANT_LOCALBOOL, VT_R8);
169         if(FAILED(hres))
170             return hres;
171         *ret = V_R8(&dst);
172         break;
173     }
174     default:
175         FIXME("arg %s not supported\n", debugstr_variant(v));
176         return E_NOTIMPL;
177     }
178
179     return S_OK;
180 }
181
182 static HRESULT to_string(VARIANT *v, BSTR *ret)
183 {
184     VARIANT dst;
185     HRESULT hres;
186
187     V_VT(&dst) = VT_EMPTY;
188     hres = VariantChangeType(&dst, v, VARIANT_LOCALBOOL, VT_BSTR);
189     if(FAILED(hres))
190         return hres;
191
192     *ret = V_BSTR(&dst);
193     return S_OK;
194 }
195
196 static IUnknown *create_object(script_ctx_t *ctx, const WCHAR *progid)
197 {
198     IInternetHostSecurityManager *secmgr = NULL;
199     IObjectWithSite *obj_site;
200     struct CONFIRMSAFETY cs;
201     IClassFactoryEx *cfex;
202     IClassFactory *cf;
203     DWORD policy_size;
204     BYTE *bpolicy;
205     IUnknown *obj;
206     DWORD policy;
207     GUID guid;
208     HRESULT hres;
209
210     hres = CLSIDFromProgID(progid, &guid);
211     if(FAILED(hres))
212         return NULL;
213
214     TRACE("GUID %s\n", debugstr_guid(&guid));
215
216     if(ctx->safeopt & INTERFACE_USES_SECURITY_MANAGER) {
217         secmgr = get_sec_mgr(ctx);
218         if(!secmgr)
219             return NULL;
220
221         policy = 0;
222         hres = IInternetHostSecurityManager_ProcessUrlAction(secmgr, URLACTION_ACTIVEX_RUN,
223                 (BYTE*)&policy, sizeof(policy), (BYTE*)&guid, sizeof(GUID), 0, 0);
224         if(FAILED(hres) || policy != URLPOLICY_ALLOW)
225             return NULL;
226     }
227
228     hres = CoGetClassObject(&guid, CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER, NULL, &IID_IClassFactory, (void**)&cf);
229     if(FAILED(hres))
230         return NULL;
231
232     hres = IClassFactory_QueryInterface(cf, &IID_IClassFactoryEx, (void**)&cfex);
233     if(SUCCEEDED(hres)) {
234         FIXME("Use IClassFactoryEx\n");
235         IClassFactoryEx_Release(cfex);
236     }
237
238     hres = IClassFactory_CreateInstance(cf, NULL, &IID_IUnknown, (void**)&obj);
239     if(FAILED(hres))
240         return NULL;
241
242     if(secmgr) {
243         cs.clsid = guid;
244         cs.pUnk = obj;
245         cs.dwFlags = 0;
246         hres = IInternetHostSecurityManager_QueryCustomPolicy(secmgr, &GUID_CUSTOM_CONFIRMOBJECTSAFETY,
247                 &bpolicy, &policy_size, (BYTE*)&cs, sizeof(cs), 0);
248         if(SUCCEEDED(hres)) {
249             policy = policy_size >= sizeof(DWORD) ? *(DWORD*)bpolicy : URLPOLICY_DISALLOW;
250             CoTaskMemFree(bpolicy);
251         }
252
253         if(FAILED(hres) || policy != URLPOLICY_ALLOW) {
254             IUnknown_Release(obj);
255             return NULL;
256         }
257     }
258
259     hres = IUnknown_QueryInterface(obj, &IID_IObjectWithSite, (void**)&obj_site);
260     if(SUCCEEDED(hres)) {
261         IUnknown *ax_site;
262
263         ax_site = create_ax_site(ctx);
264         if(ax_site) {
265             hres = IObjectWithSite_SetSite(obj_site, ax_site);
266             IUnknown_Release(ax_site);
267         }
268         IObjectWithSite_Release(obj_site);
269         if(!ax_site || FAILED(hres)) {
270             IUnknown_Release(obj);
271             return NULL;
272         }
273     }
274
275     return obj;
276 }
277
278 static HRESULT show_msgbox(script_ctx_t *ctx, BSTR prompt, VARIANT *res)
279 {
280     SCRIPTUICHANDLING uic_handling = SCRIPTUICHANDLING_ALLOW;
281     IActiveScriptSiteUIControl *ui_control;
282     IActiveScriptSiteWindow *acts_window;
283     const WCHAR *title;
284     HWND hwnd = NULL;
285     int ret;
286     HRESULT hres;
287
288     hres = IActiveScriptSite_QueryInterface(ctx->site, &IID_IActiveScriptSiteUIControl, (void**)&ui_control);
289     if(SUCCEEDED(hres)) {
290         hres = IActiveScriptSiteUIControl_GetUIBehavior(ui_control, SCRIPTUICITEM_MSGBOX, &uic_handling);
291         IActiveScriptSiteUIControl_Release(ui_control);
292         if(FAILED(hres))
293             uic_handling = SCRIPTUICHANDLING_ALLOW;
294     }
295
296     switch(uic_handling) {
297     case SCRIPTUICHANDLING_ALLOW:
298         break;
299     case SCRIPTUICHANDLING_NOUIDEFAULT:
300         return return_short(res, 0);
301     default:
302         FIXME("blocked\n");
303         return E_FAIL;
304     }
305
306     title = (ctx->safeopt & INTERFACE_USES_SECURITY_MANAGER) ? vbscriptW : emptyW;
307
308     hres = IActiveScriptSite_QueryInterface(ctx->site, &IID_IActiveScriptSiteWindow, (void**)&acts_window);
309     if(FAILED(hres)) {
310         FIXME("No IActiveScriptSiteWindow\n");
311         return hres;
312     }
313
314     hres = IActiveScriptSiteWindow_GetWindow(acts_window, &hwnd);
315     if(SUCCEEDED(hres)) {
316         hres = IActiveScriptSiteWindow_EnableModeless(acts_window, FALSE);
317         if(SUCCEEDED(hres)) {
318             ret = MessageBoxW(hwnd, prompt, title, MB_OK);
319             hres = IActiveScriptSiteWindow_EnableModeless(acts_window, TRUE);
320         }
321     }
322
323     IActiveScriptSiteWindow_Release(acts_window);
324     if(FAILED(hres)) {
325         FIXME("failed: %08x\n", hres);
326         return hres;
327     }
328
329     return return_short(res, ret);
330 }
331
332 static HRESULT Global_CCur(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
333 {
334     FIXME("\n");
335     return E_NOTIMPL;
336 }
337
338 static HRESULT Global_CInt(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
339 {
340     FIXME("\n");
341     return E_NOTIMPL;
342 }
343
344 static HRESULT Global_CLng(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
345 {
346     FIXME("\n");
347     return E_NOTIMPL;
348 }
349
350 static HRESULT Global_CBool(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
351 {
352     FIXME("\n");
353     return E_NOTIMPL;
354 }
355
356 static HRESULT Global_CByte(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
357 {
358     FIXME("\n");
359     return E_NOTIMPL;
360 }
361
362 static HRESULT Global_CDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
363 {
364     FIXME("\n");
365     return E_NOTIMPL;
366 }
367
368 static HRESULT Global_CDbl(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
369 {
370     FIXME("\n");
371     return E_NOTIMPL;
372 }
373
374 static HRESULT Global_CSng(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
375 {
376     FIXME("\n");
377     return E_NOTIMPL;
378 }
379
380 static HRESULT Global_CStr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
381 {
382     FIXME("\n");
383     return E_NOTIMPL;
384 }
385
386 static inline WCHAR hex_char(unsigned n)
387 {
388     return n < 10 ? '0'+n : 'A'+n-10;
389 }
390
391 static HRESULT Global_Hex(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
392 {
393     WCHAR buf[17], *ptr;
394     DWORD n;
395
396     TRACE("%s\n", debugstr_variant(arg));
397
398     switch(V_VT(arg)) {
399     case VT_I2:
400         n = (WORD)V_I2(arg);
401         break;
402     case VT_I4:
403         n = V_I4(arg);
404         break;
405     case VT_EMPTY:
406         n = 0;
407         break;
408     case VT_NULL:
409         if(res)
410             V_VT(res) = VT_NULL;
411         return S_OK;
412     default:
413         FIXME("unsupported type %s\n", debugstr_variant(arg));
414         return E_NOTIMPL;
415     }
416
417     buf[16] = 0;
418     ptr = buf+15;
419
420     if(n) {
421         do {
422             *ptr-- = hex_char(n & 0xf);
423             n >>= 4;
424         }while(n);
425         ptr++;
426     }else {
427         *ptr = '0';
428     }
429
430     return return_bstr(res, ptr);
431 }
432
433 static HRESULT Global_Oct(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
434 {
435     FIXME("\n");
436     return E_NOTIMPL;
437 }
438
439 static HRESULT Global_VarType(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
440 {
441     FIXME("\n");
442     return E_NOTIMPL;
443 }
444
445 static HRESULT Global_IsDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
446 {
447     FIXME("\n");
448     return E_NOTIMPL;
449 }
450
451 static HRESULT Global_IsEmpty(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
452 {
453     TRACE("(%s)\n", debugstr_variant(arg));
454
455     assert(args_cnt == 1);
456
457     if(res) {
458         V_VT(res) = VT_BOOL;
459         V_BOOL(res) = V_VT(arg) == VT_EMPTY ? VARIANT_TRUE : VARIANT_FALSE;
460     }
461     return S_OK;
462 }
463
464 static HRESULT Global_IsNull(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
465 {
466     TRACE("(%s)\n", debugstr_variant(arg));
467
468     assert(args_cnt == 1);
469
470     if(res) {
471         V_VT(res) = VT_BOOL;
472         V_BOOL(res) = V_VT(arg) == VT_NULL ? VARIANT_TRUE : VARIANT_FALSE;
473     }
474     return S_OK;
475 }
476
477 static HRESULT Global_IsNumeric(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
478 {
479     FIXME("\n");
480     return E_NOTIMPL;
481 }
482
483 static HRESULT Global_IsArray(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
484 {
485     FIXME("\n");
486     return E_NOTIMPL;
487 }
488
489 static HRESULT Global_IsObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
490 {
491     TRACE("(%s)\n", debugstr_variant(arg));
492
493     assert(args_cnt == 1);
494
495     if(res) {
496         V_VT(res) = VT_BOOL;
497         V_BOOL(res) = V_VT(arg) == VT_DISPATCH ? VARIANT_TRUE : VARIANT_FALSE;
498     }
499     return S_OK;
500 }
501
502 static HRESULT Global_Ant(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
503 {
504     FIXME("\n");
505     return E_NOTIMPL;
506 }
507
508 static HRESULT Global_Cos(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
509 {
510     FIXME("\n");
511     return E_NOTIMPL;
512 }
513
514 static HRESULT Global_Sin(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
515 {
516     FIXME("\n");
517     return E_NOTIMPL;
518 }
519
520 static HRESULT Global_Tan(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
521 {
522     FIXME("\n");
523     return E_NOTIMPL;
524 }
525
526 static HRESULT Global_Exp(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
527 {
528     FIXME("\n");
529     return E_NOTIMPL;
530 }
531
532 static HRESULT Global_Log(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
533 {
534     FIXME("\n");
535     return E_NOTIMPL;
536 }
537
538 static HRESULT Global_Sqr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
539 {
540     FIXME("\n");
541     return E_NOTIMPL;
542 }
543
544 static HRESULT Global_Randomize(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
545 {
546     FIXME("\n");
547     return E_NOTIMPL;
548 }
549
550 static HRESULT Global_Rnd(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
551 {
552     FIXME("\n");
553     return E_NOTIMPL;
554 }
555
556 static HRESULT Global_Timer(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
557 {
558     FIXME("\n");
559     return E_NOTIMPL;
560 }
561
562 static HRESULT Global_LBound(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
563 {
564     FIXME("\n");
565     return E_NOTIMPL;
566 }
567
568 static HRESULT Global_UBound(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
569 {
570     FIXME("\n");
571     return E_NOTIMPL;
572 }
573
574 static HRESULT Global_RGB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
575 {
576     FIXME("\n");
577     return E_NOTIMPL;
578 }
579
580 static HRESULT Global_Len(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
581 {
582     DWORD len;
583     HRESULT hres;
584
585     TRACE("%s\n", debugstr_variant(arg));
586
587     if(V_VT(arg) == VT_NULL)
588         return return_null(res);
589
590     if(V_VT(arg) != VT_BSTR) {
591         BSTR str;
592
593         hres = to_string(arg, &str);
594         if(FAILED(hres))
595             return hres;
596
597         len = SysStringLen(str);
598         SysFreeString(str);
599     }else {
600         len = SysStringLen(V_BSTR(arg));
601     }
602
603     return return_int(res, len);
604 }
605
606 static HRESULT Global_LenB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
607 {
608     FIXME("\n");
609     return E_NOTIMPL;
610 }
611
612 static HRESULT Global_Left(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
613 {
614     FIXME("\n");
615     return E_NOTIMPL;
616 }
617
618 static HRESULT Global_LeftB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
619 {
620     FIXME("\n");
621     return E_NOTIMPL;
622 }
623
624 static HRESULT Global_Right(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
625 {
626     FIXME("\n");
627     return E_NOTIMPL;
628 }
629
630 static HRESULT Global_RightB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
631 {
632     FIXME("\n");
633     return E_NOTIMPL;
634 }
635
636 static HRESULT Global_Mid(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
637 {
638     int len = -1, start, str_len;
639     BSTR str;
640     HRESULT hres;
641
642     TRACE("\n");
643
644     switch(args_cnt) {
645     case 3:
646         hres = to_int(args, &len);
647         if(FAILED(hres))
648             return hres;
649
650         if(len < 0) {
651             FIXME("len = %d\n", len);
652             return E_FAIL;
653         }
654         /* fallthrough */
655     case 2:
656         hres = to_int(args+args_cnt-2, &start);
657         if(FAILED(hres))
658             return hres;
659
660         if(V_VT(args+args_cnt-1) != VT_BSTR) {
661             FIXME("args[0] = %s\n", debugstr_variant(args+args_cnt-1));
662             return E_NOTIMPL;
663         }
664
665         str = V_BSTR(args+args_cnt-1);
666         break;
667     default:
668         assert(0);
669     }
670
671
672     str_len = SysStringLen(str);
673     start--;
674     if(start > str_len)
675         start = str_len;
676
677     if(len == -1)
678         len = str_len-start;
679     else if(len > str_len-start)
680         len = str_len-start;
681
682     if(res) {
683         V_VT(res) = VT_BSTR;
684         V_BSTR(res) = SysAllocStringLen(str+start, len);
685         if(!V_BSTR(res))
686             return E_OUTOFMEMORY;
687     }
688
689     return S_OK;
690 }
691
692 static HRESULT Global_MidB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
693 {
694     FIXME("\n");
695     return E_NOTIMPL;
696 }
697
698 static HRESULT Global_StrComp(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
699 {
700     FIXME("\n");
701     return E_NOTIMPL;
702 }
703
704 static HRESULT Global_LCase(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
705 {
706     BSTR str;
707     HRESULT hres;
708
709     TRACE("%s\n", debugstr_variant(arg));
710
711     if(V_VT(arg) == VT_NULL) {
712         if(res)
713             V_VT(res) = VT_NULL;
714         return S_OK;
715     }
716
717     hres = to_string(arg, &str);
718     if(FAILED(hres))
719         return hres;
720
721     if(res) {
722         WCHAR *ptr;
723
724         for(ptr = str; *ptr; ptr++)
725             *ptr = tolowerW(*ptr);
726
727         V_VT(res) = VT_BSTR;
728         V_BSTR(res) = str;
729     }else {
730         SysFreeString(str);
731     }
732     return S_OK;
733 }
734
735 static HRESULT Global_UCase(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
736 {
737     BSTR str;
738     HRESULT hres;
739
740     TRACE("%s\n", debugstr_variant(arg));
741
742     if(V_VT(arg) == VT_NULL) {
743         if(res)
744             V_VT(res) = VT_NULL;
745         return S_OK;
746     }
747
748     hres = to_string(arg, &str);
749     if(FAILED(hres))
750         return hres;
751
752     if(res) {
753         WCHAR *ptr;
754
755         for(ptr = str; *ptr; ptr++)
756             *ptr = toupperW(*ptr);
757
758         V_VT(res) = VT_BSTR;
759         V_BSTR(res) = str;
760     }else {
761         SysFreeString(str);
762     }
763     return S_OK;
764 }
765
766 static HRESULT Global_LTrim(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
767 {
768     FIXME("\n");
769     return E_NOTIMPL;
770 }
771
772 static HRESULT Global_RTrim(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
773 {
774     FIXME("\n");
775     return E_NOTIMPL;
776 }
777
778 static HRESULT Global_Trim(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
779 {
780     FIXME("\n");
781     return E_NOTIMPL;
782 }
783
784 static HRESULT Global_Space(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
785 {
786     BSTR str;
787     int n, i;
788     HRESULT hres;
789
790     TRACE("%s\n", debugstr_variant(arg));
791
792     hres = to_int(arg, &n);
793     if(FAILED(hres))
794         return hres;
795
796     if(n < 0) {
797         FIXME("n = %d\n", n);
798         return E_NOTIMPL;
799     }
800
801     if(!res)
802         return S_OK;
803
804     str = SysAllocStringLen(NULL, n);
805     if(!str)
806         return E_OUTOFMEMORY;
807
808     for(i=0; i<n; i++)
809         str[i] = ' ';
810
811     V_VT(res) = VT_BSTR;
812     V_BSTR(res) = str;
813     return S_OK;
814 }
815
816 static HRESULT Global_String(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
817 {
818     FIXME("\n");
819     return E_NOTIMPL;
820 }
821
822 static HRESULT Global_InStr(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
823 {
824     VARIANT *startv, *str1v, *str2v;
825     BSTR str1, str2;
826     int start, ret;
827     HRESULT hres;
828
829     TRACE("\n");
830
831     switch(args_cnt) {
832     case 2:
833         startv = NULL;
834         str1v = args+1;
835         str2v = args;
836         break;
837     case 3:
838         startv = args+2;
839         str1v = args+1;
840         str2v = args;
841         break;
842     case 4:
843         FIXME("unsupported compare argument %s\n", debugstr_variant(args));
844         return E_NOTIMPL;
845     default:
846         assert(0);
847     }
848
849     if(startv) {
850         hres = to_int(startv, &start);
851         if(FAILED(hres))
852             return hres;
853         if(--start < 0) {
854             FIXME("start %d\n", start);
855             return E_FAIL;
856         }
857     }else {
858         start = 0;
859     }
860
861     if(V_VT(str1v) == VT_NULL || V_VT(str2v) == VT_NULL)
862         return return_null(res);
863
864     if(V_VT(str1v) != VT_BSTR) {
865         FIXME("Unsupported str1 type %s\n", debugstr_variant(str1v));
866         return E_NOTIMPL;
867     }
868     str1 = V_BSTR(str1v);
869
870     if(V_VT(str2v) != VT_BSTR) {
871         FIXME("Unsupported str2 type %s\n", debugstr_variant(str2v));
872         return E_NOTIMPL;
873     }
874     str2 = V_BSTR(str2v);
875
876     if(start < SysStringLen(str1)) {
877         WCHAR *ptr;
878
879         ptr = strstrW(str1+start, str2);
880         ret = ptr ? ptr-str1+1 : 0;
881     }else {
882         ret = 0;
883     }
884
885     return return_int(res, ret);
886 }
887
888 static HRESULT Global_InStrB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
889 {
890     FIXME("\n");
891     return E_NOTIMPL;
892 }
893
894 static HRESULT Global_AscB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
895 {
896     FIXME("\n");
897     return E_NOTIMPL;
898 }
899
900 static HRESULT Global_ChrB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
901 {
902     FIXME("\n");
903     return E_NOTIMPL;
904 }
905
906 static HRESULT Global_Asc(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
907 {
908     FIXME("\n");
909     return E_NOTIMPL;
910 }
911
912 static HRESULT Global_Chr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
913 {
914     FIXME("\n");
915     return E_NOTIMPL;
916 }
917
918 static HRESULT Global_AscW(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
919 {
920     FIXME("\n");
921     return E_NOTIMPL;
922 }
923
924 static HRESULT Global_ChrW(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
925 {
926     FIXME("\n");
927     return E_NOTIMPL;
928 }
929
930 static HRESULT Global_Abs(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
931 {
932     FIXME("\n");
933     return E_NOTIMPL;
934 }
935
936 static HRESULT Global_Fix(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
937 {
938     FIXME("\n");
939     return E_NOTIMPL;
940 }
941
942 static HRESULT Global_Int(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
943 {
944     FIXME("\n");
945     return E_NOTIMPL;
946 }
947
948 static HRESULT Global_Sgn(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
949 {
950     FIXME("\n");
951     return E_NOTIMPL;
952 }
953
954 static HRESULT Global_Now(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
955 {
956     FIXME("\n");
957     return E_NOTIMPL;
958 }
959
960 static HRESULT Global_Date(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
961 {
962     FIXME("\n");
963     return E_NOTIMPL;
964 }
965
966 static HRESULT Global_Time(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
967 {
968     FIXME("\n");
969     return E_NOTIMPL;
970 }
971
972 static HRESULT Global_Day(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
973 {
974     FIXME("\n");
975     return E_NOTIMPL;
976 }
977
978 static HRESULT Global_Month(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
979 {
980     FIXME("\n");
981     return E_NOTIMPL;
982 }
983
984 static HRESULT Global_Weekday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
985 {
986     FIXME("\n");
987     return E_NOTIMPL;
988 }
989
990 static HRESULT Global_Year(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
991 {
992     FIXME("\n");
993     return E_NOTIMPL;
994 }
995
996 static HRESULT Global_Hour(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
997 {
998     FIXME("\n");
999     return E_NOTIMPL;
1000 }
1001
1002 static HRESULT Global_Minute(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1003 {
1004     FIXME("\n");
1005     return E_NOTIMPL;
1006 }
1007
1008 static HRESULT Global_Second(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1009 {
1010     FIXME("\n");
1011     return E_NOTIMPL;
1012 }
1013
1014 static HRESULT Global_DateValue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1015 {
1016     FIXME("\n");
1017     return E_NOTIMPL;
1018 }
1019
1020 static HRESULT Global_TimeValue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1021 {
1022     FIXME("\n");
1023     return E_NOTIMPL;
1024 }
1025
1026 static HRESULT Global_DateSerial(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1027 {
1028     FIXME("\n");
1029     return E_NOTIMPL;
1030 }
1031
1032 static HRESULT Global_TimeSerial(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1033 {
1034     FIXME("\n");
1035     return E_NOTIMPL;
1036 }
1037
1038 static HRESULT Global_InputBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1039 {
1040     FIXME("\n");
1041     return E_NOTIMPL;
1042 }
1043
1044 static HRESULT Global_MsgBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1045 {
1046     BSTR prompt;
1047     HRESULT hres;
1048
1049     TRACE("\n");
1050
1051     if(args_cnt != 1) {
1052         FIXME("unsupported arg_cnt %d\n", args_cnt);
1053         return E_NOTIMPL;
1054     }
1055
1056     hres = to_string(arg, &prompt);
1057     if(FAILED(hres))
1058         return hres;
1059
1060     hres = show_msgbox(This->desc->ctx, prompt, res);
1061     SysFreeString(prompt);
1062     return hres;
1063 }
1064
1065 static HRESULT Global_CreateObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1066 {
1067     IUnknown *obj;
1068     HRESULT hres;
1069
1070     TRACE("(%s)\n", debugstr_variant(arg));
1071
1072     if(V_VT(arg) != VT_BSTR) {
1073         FIXME("non-bstr arg\n");
1074         return E_INVALIDARG;
1075     }
1076
1077     obj = create_object(This->desc->ctx, V_BSTR(arg));
1078     if(!obj)
1079         return VB_E_CANNOT_CREATE_OBJ;
1080
1081     if(res) {
1082         hres = IUnknown_QueryInterface(obj, &IID_IDispatch, (void**)&V_DISPATCH(res));
1083         if(FAILED(hres))
1084             return hres;
1085
1086         V_VT(res) = VT_DISPATCH;
1087     }
1088
1089     IUnknown_Release(obj);
1090     return S_OK;
1091 }
1092
1093 static HRESULT Global_GetObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1094 {
1095     FIXME("\n");
1096     return E_NOTIMPL;
1097 }
1098
1099 static HRESULT Global_DateAdd(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1100 {
1101     FIXME("\n");
1102     return E_NOTIMPL;
1103 }
1104
1105 static HRESULT Global_DateDiff(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1106 {
1107     FIXME("\n");
1108     return E_NOTIMPL;
1109 }
1110
1111 static HRESULT Global_DatePart(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1112 {
1113     FIXME("\n");
1114     return E_NOTIMPL;
1115 }
1116
1117 static HRESULT Global_TypeName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1118 {
1119     FIXME("\n");
1120     return E_NOTIMPL;
1121 }
1122
1123 static HRESULT Global_Array(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1124 {
1125     FIXME("\n");
1126     return E_NOTIMPL;
1127 }
1128
1129 static HRESULT Global_Erase(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1130 {
1131     FIXME("\n");
1132     return E_NOTIMPL;
1133 }
1134
1135 static HRESULT Global_Filter(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1136 {
1137     FIXME("\n");
1138     return E_NOTIMPL;
1139 }
1140
1141 static HRESULT Global_Join(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1142 {
1143     FIXME("\n");
1144     return E_NOTIMPL;
1145 }
1146
1147 static HRESULT Global_Split(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1148 {
1149     FIXME("\n");
1150     return E_NOTIMPL;
1151 }
1152
1153 static HRESULT Global_Replace(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1154 {
1155     FIXME("\n");
1156     return E_NOTIMPL;
1157 }
1158
1159 static HRESULT Global_StrReverse(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1160 {
1161     FIXME("\n");
1162     return E_NOTIMPL;
1163 }
1164
1165 static HRESULT Global_InStrRev(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1166 {
1167     FIXME("\n");
1168     return E_NOTIMPL;
1169 }
1170
1171 static HRESULT Global_LoadPicture(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1172 {
1173     FIXME("\n");
1174     return E_NOTIMPL;
1175 }
1176
1177 static HRESULT Global_ScriptEngine(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1178 {
1179     FIXME("\n");
1180     return E_NOTIMPL;
1181 }
1182
1183 static HRESULT Global_ScriptEngineMajorVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1184 {
1185     FIXME("\n");
1186     return E_NOTIMPL;
1187 }
1188
1189 static HRESULT Global_ScriptEngineMinorVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1190 {
1191     FIXME("\n");
1192     return E_NOTIMPL;
1193 }
1194
1195 static HRESULT Global_ScriptEngineBuildVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1196 {
1197     FIXME("\n");
1198     return E_NOTIMPL;
1199 }
1200
1201 static HRESULT Global_FormatNumber(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1202 {
1203     FIXME("\n");
1204     return E_NOTIMPL;
1205 }
1206
1207 static HRESULT Global_FormatCurrency(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1208 {
1209     FIXME("\n");
1210     return E_NOTIMPL;
1211 }
1212
1213 static HRESULT Global_FormatPercent(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1214 {
1215     FIXME("\n");
1216     return E_NOTIMPL;
1217 }
1218
1219 static HRESULT Global_FormatDateTime(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1220 {
1221     FIXME("\n");
1222     return E_NOTIMPL;
1223 }
1224
1225 static HRESULT Global_WeekdayName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1226 {
1227     FIXME("\n");
1228     return E_NOTIMPL;
1229 }
1230
1231 static HRESULT Global_MonthName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1232 {
1233     FIXME("\n");
1234     return E_NOTIMPL;
1235 }
1236
1237 static HRESULT Global_Round(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1238 {
1239     double n;
1240     HRESULT hres;
1241
1242     TRACE("%s\n", debugstr_variant(arg));
1243
1244     if(!res)
1245         return S_OK;
1246
1247     switch(V_VT(arg)) {
1248     case VT_I2:
1249     case VT_I4:
1250     case VT_BOOL:
1251         *res = *arg;
1252         return S_OK;
1253     case VT_R8:
1254         n = V_R8(arg);
1255         break;
1256     default:
1257         hres = to_double(arg, &n);
1258         if(FAILED(hres))
1259             return hres;
1260     }
1261
1262     return return_double(res, round(n));
1263 }
1264
1265 static HRESULT Global_Escape(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1266 {
1267     FIXME("\n");
1268     return E_NOTIMPL;
1269 }
1270
1271 static HRESULT Global_Unescape(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1272 {
1273     FIXME("\n");
1274     return E_NOTIMPL;
1275 }
1276
1277 static HRESULT Global_Eval(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1278 {
1279     FIXME("\n");
1280     return E_NOTIMPL;
1281 }
1282
1283 static HRESULT Global_Execute(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1284 {
1285     FIXME("\n");
1286     return E_NOTIMPL;
1287 }
1288
1289 static HRESULT Global_ExecuteGlobal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1290 {
1291     FIXME("\n");
1292     return E_NOTIMPL;
1293 }
1294
1295 static HRESULT Global_GetRef(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1296 {
1297     FIXME("\n");
1298     return E_NOTIMPL;
1299 }
1300
1301 static HRESULT Global_vbUseSystem(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1302 {
1303     FIXME("\n");
1304     return E_NOTIMPL;
1305 }
1306
1307 static HRESULT Global_vbUseSystemDayOfWeek(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1308 {
1309     FIXME("\n");
1310     return E_NOTIMPL;
1311 }
1312
1313 static HRESULT Global_vbSunday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1314 {
1315     TRACE("\n");
1316     return return_short(res, 1);
1317 }
1318
1319 static HRESULT Global_vbMonday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1320 {
1321     TRACE("\n");
1322     return return_short(res, 2);
1323 }
1324
1325 static HRESULT Global_vbTuesday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1326 {
1327     TRACE("\n");
1328     return return_short(res, 3);
1329 }
1330
1331 static HRESULT Global_vbWednesday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1332 {
1333     TRACE("\n");
1334     return return_short(res, 4);
1335 }
1336
1337 static HRESULT Global_vbThursday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1338 {
1339     TRACE("\n");
1340     return return_short(res, 5);
1341 }
1342
1343 static HRESULT Global_vbFriday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1344 {
1345     TRACE("\n");
1346     return return_short(res, 6);
1347 }
1348
1349 static HRESULT Global_vbSaturday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1350 {
1351     TRACE("\n");
1352     return return_short(res, 7);
1353 }
1354
1355 static HRESULT Global_vbFirstJan1(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1356 {
1357     FIXME("\n");
1358     return E_NOTIMPL;
1359 }
1360
1361 static HRESULT Global_vbFirstFourDays(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1362 {
1363     FIXME("\n");
1364     return E_NOTIMPL;
1365 }
1366
1367 static HRESULT Global_vbFirstFullWeek(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1368 {
1369     FIXME("\n");
1370     return E_NOTIMPL;
1371 }
1372
1373 static HRESULT Global_vbOKOnly(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1374 {
1375     FIXME("\n");
1376     return E_NOTIMPL;
1377 }
1378
1379 static HRESULT Global_vbOKCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1380 {
1381     FIXME("\n");
1382     return E_NOTIMPL;
1383 }
1384
1385 static HRESULT Global_vbAbortRetryIgnore(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1386 {
1387     FIXME("\n");
1388     return E_NOTIMPL;
1389 }
1390
1391 static HRESULT Global_vbYesNoCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1392 {
1393     FIXME("\n");
1394     return E_NOTIMPL;
1395 }
1396
1397 static HRESULT Global_vbYesNo(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1398 {
1399     FIXME("\n");
1400     return E_NOTIMPL;
1401 }
1402
1403 static HRESULT Global_vbRetryCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1404 {
1405     FIXME("\n");
1406     return E_NOTIMPL;
1407 }
1408
1409 static HRESULT Global_vbCritical(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1410 {
1411     FIXME("\n");
1412     return E_NOTIMPL;
1413 }
1414
1415 static HRESULT Global_vbQuestion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1416 {
1417     FIXME("\n");
1418     return E_NOTIMPL;
1419 }
1420
1421 static HRESULT Global_vbExclamation(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1422 {
1423     FIXME("\n");
1424     return E_NOTIMPL;
1425 }
1426
1427 static HRESULT Global_vbInformation(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1428 {
1429     FIXME("\n");
1430     return E_NOTIMPL;
1431 }
1432
1433 static HRESULT Global_vbDefaultButton1(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1434 {
1435     FIXME("\n");
1436     return E_NOTIMPL;
1437 }
1438
1439 static HRESULT Global_vbDefaultButton2(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1440 {
1441     FIXME("\n");
1442     return E_NOTIMPL;
1443 }
1444
1445 static HRESULT Global_vbDefaultButton3(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1446 {
1447     FIXME("\n");
1448     return E_NOTIMPL;
1449 }
1450
1451 static HRESULT Global_vbDefaultButton4(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1452 {
1453     FIXME("\n");
1454     return E_NOTIMPL;
1455 }
1456
1457 static HRESULT Global_vbApplicationModal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1458 {
1459     FIXME("\n");
1460     return E_NOTIMPL;
1461 }
1462
1463 static HRESULT Global_vbSystemModal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1464 {
1465     FIXME("\n");
1466     return E_NOTIMPL;
1467 }
1468
1469 static HRESULT Global_vbOK(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1470 {
1471     FIXME("\n");
1472     return E_NOTIMPL;
1473 }
1474
1475 static HRESULT Global_vbCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1476 {
1477     FIXME("\n");
1478     return E_NOTIMPL;
1479 }
1480
1481 static HRESULT Global_vbAbort(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1482 {
1483     FIXME("\n");
1484     return E_NOTIMPL;
1485 }
1486
1487 static HRESULT Global_vbRetry(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1488 {
1489     FIXME("\n");
1490     return E_NOTIMPL;
1491 }
1492
1493 static HRESULT Global_vbIgnore(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1494 {
1495     FIXME("\n");
1496     return E_NOTIMPL;
1497 }
1498
1499 static HRESULT Global_vbYes(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1500 {
1501     FIXME("\n");
1502     return E_NOTIMPL;
1503 }
1504
1505 static HRESULT Global_vbNo(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1506 {
1507     FIXME("\n");
1508     return E_NOTIMPL;
1509 }
1510
1511 static HRESULT Global_vbEmpty(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1512 {
1513     FIXME("\n");
1514     return E_NOTIMPL;
1515 }
1516
1517 static HRESULT Global_vbNull(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1518 {
1519     FIXME("\n");
1520     return E_NOTIMPL;
1521 }
1522
1523 static HRESULT Global_vbInteger(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1524 {
1525     FIXME("\n");
1526     return E_NOTIMPL;
1527 }
1528
1529 static HRESULT Global_vbLong(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1530 {
1531     FIXME("\n");
1532     return E_NOTIMPL;
1533 }
1534
1535 static HRESULT Global_vbSingle(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1536 {
1537     FIXME("\n");
1538     return E_NOTIMPL;
1539 }
1540
1541 static HRESULT Global_vbDouble(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1542 {
1543     FIXME("\n");
1544     return E_NOTIMPL;
1545 }
1546
1547 static HRESULT Global_vbCurrency(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1548 {
1549     FIXME("\n");
1550     return E_NOTIMPL;
1551 }
1552
1553 static HRESULT Global_vbDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1554 {
1555     FIXME("\n");
1556     return E_NOTIMPL;
1557 }
1558
1559 static HRESULT Global_vbString(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1560 {
1561     FIXME("\n");
1562     return E_NOTIMPL;
1563 }
1564
1565 static HRESULT Global_vbObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1566 {
1567     FIXME("\n");
1568     return E_NOTIMPL;
1569 }
1570
1571 static HRESULT Global_vbError(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1572 {
1573     FIXME("\n");
1574     return E_NOTIMPL;
1575 }
1576
1577 static HRESULT Global_vbBoolean(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1578 {
1579     FIXME("\n");
1580     return E_NOTIMPL;
1581 }
1582
1583 static HRESULT Global_vbVariant(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1584 {
1585     FIXME("\n");
1586     return E_NOTIMPL;
1587 }
1588
1589 static HRESULT Global_vbDataObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1590 {
1591     FIXME("\n");
1592     return E_NOTIMPL;
1593 }
1594
1595 static HRESULT Global_vbDecimal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1596 {
1597     FIXME("\n");
1598     return E_NOTIMPL;
1599 }
1600
1601 static HRESULT Global_vbByte(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1602 {
1603     FIXME("\n");
1604     return E_NOTIMPL;
1605 }
1606
1607 static HRESULT Global_vbArray(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1608 {
1609     FIXME("\n");
1610     return E_NOTIMPL;
1611 }
1612
1613 static HRESULT Global_vbTrue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1614 {
1615     FIXME("\n");
1616     return E_NOTIMPL;
1617 }
1618
1619 static HRESULT Global_vbFalse(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1620 {
1621     FIXME("\n");
1622     return E_NOTIMPL;
1623 }
1624
1625 static HRESULT Global_vbUseDefault(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1626 {
1627     FIXME("\n");
1628     return E_NOTIMPL;
1629 }
1630
1631 static HRESULT Global_vbBinaryCompare(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1632 {
1633     FIXME("\n");
1634     return E_NOTIMPL;
1635 }
1636
1637 static HRESULT Global_vbTextCompare(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1638 {
1639     FIXME("\n");
1640     return E_NOTIMPL;
1641 }
1642
1643 static HRESULT Global_vbDatabaseCompare(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1644 {
1645     FIXME("\n");
1646     return E_NOTIMPL;
1647 }
1648
1649 static HRESULT Global_vbGeneralDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1650 {
1651     FIXME("\n");
1652     return E_NOTIMPL;
1653 }
1654
1655 static HRESULT Global_vbLongDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1656 {
1657     FIXME("\n");
1658     return E_NOTIMPL;
1659 }
1660
1661 static HRESULT Global_vbShortDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1662 {
1663     FIXME("\n");
1664     return E_NOTIMPL;
1665 }
1666
1667 static HRESULT Global_vbLongTime(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1668 {
1669     FIXME("\n");
1670     return E_NOTIMPL;
1671 }
1672
1673 static HRESULT Global_vbShortTime(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1674 {
1675     FIXME("\n");
1676     return E_NOTIMPL;
1677 }
1678
1679 static HRESULT Global_vbObjectError(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1680 {
1681     FIXME("\n");
1682     return E_NOTIMPL;
1683 }
1684
1685 static HRESULT Global_vbBlack(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1686 {
1687     FIXME("\n");
1688     return E_NOTIMPL;
1689 }
1690
1691 static HRESULT Global_vbBlue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1692 {
1693     FIXME("\n");
1694     return E_NOTIMPL;
1695 }
1696
1697 static HRESULT Global_vbCyan(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1698 {
1699     FIXME("\n");
1700     return E_NOTIMPL;
1701 }
1702
1703 static HRESULT Global_vbGreen(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1704 {
1705     FIXME("\n");
1706     return E_NOTIMPL;
1707 }
1708
1709 static HRESULT Global_vbMagenta(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1710 {
1711     FIXME("\n");
1712     return E_NOTIMPL;
1713 }
1714
1715 static HRESULT Global_vbRed(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1716 {
1717     FIXME("\n");
1718     return E_NOTIMPL;
1719 }
1720
1721 static HRESULT Global_vbWhite(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1722 {
1723     FIXME("\n");
1724     return E_NOTIMPL;
1725 }
1726
1727 static HRESULT Global_vbYellow(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1728 {
1729     FIXME("\n");
1730     return E_NOTIMPL;
1731 }
1732
1733 static HRESULT Global_vbCr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1734 {
1735     FIXME("\n");
1736     return E_NOTIMPL;
1737 }
1738
1739 static HRESULT Global_vbCrLf(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1740 {
1741     FIXME("\n");
1742     return E_NOTIMPL;
1743 }
1744
1745 static HRESULT Global_vbNewLine(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1746 {
1747     FIXME("\n");
1748     return E_NOTIMPL;
1749 }
1750
1751 static HRESULT Global_vbFormFeed(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1752 {
1753     FIXME("\n");
1754     return E_NOTIMPL;
1755 }
1756
1757 static HRESULT Global_vbLf(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1758 {
1759     FIXME("\n");
1760     return E_NOTIMPL;
1761 }
1762
1763 static HRESULT Global_vbNullChar(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1764 {
1765     FIXME("\n");
1766     return E_NOTIMPL;
1767 }
1768
1769 static HRESULT Global_vbNullString(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1770 {
1771     FIXME("\n");
1772     return E_NOTIMPL;
1773 }
1774
1775 static HRESULT Global_vbTab(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1776 {
1777     FIXME("\n");
1778     return E_NOTIMPL;
1779 }
1780
1781 static HRESULT Global_vbVerticalTab(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1782 {
1783     FIXME("\n");
1784     return E_NOTIMPL;
1785 }
1786
1787 static HRESULT Global_vbMsgBoxHelpButton(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1788 {
1789     FIXME("\n");
1790     return E_NOTIMPL;
1791 }
1792
1793 static HRESULT Global_vbMsgBoxSetForeground(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1794 {
1795     FIXME("\n");
1796     return E_NOTIMPL;
1797 }
1798
1799 static HRESULT Global_vbMsgBoxRight(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1800 {
1801     FIXME("\n");
1802     return E_NOTIMPL;
1803 }
1804
1805 static HRESULT Global_vbMsgBoxRtlReading(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1806 {
1807     FIXME("\n");
1808     return E_NOTIMPL;
1809 }
1810
1811 static const builtin_prop_t global_props[] = {
1812     {DISPID_GLOBAL_VBUSESYSTEM,        Global_vbUseSystem, BP_GET},
1813     {DISPID_GLOBAL_USESYSTEMDAYOFWEEK, Global_vbUseSystemDayOfWeek, BP_GET},
1814     {DISPID_GLOBAL_VBSUNDAY,           Global_vbSunday, BP_GET},
1815     {DISPID_GLOBAL_VBMONDAY,           Global_vbMonday, BP_GET},
1816     {DISPID_GLOBAL_VBTUESDAY,          Global_vbTuesday, BP_GET},
1817     {DISPID_GLOBAL_VBWEDNESDAY,        Global_vbWednesday, BP_GET},
1818     {DISPID_GLOBAL_VBTHURSDAY,         Global_vbThursday, BP_GET},
1819     {DISPID_GLOBAL_VBFRIDAY,           Global_vbFriday, BP_GET},
1820     {DISPID_GLOBAL_VBSATURDAY,         Global_vbSaturday, BP_GET},
1821     {DISPID_GLOBAL_VBFIRSTJAN1,        Global_vbFirstJan1, BP_GET},
1822     {DISPID_GLOBAL_VBFIRSTFOURDAYS,    Global_vbFirstFourDays, BP_GET},
1823     {DISPID_GLOBAL_VBFIRSTFULLWEEK,    Global_vbFirstFullWeek, BP_GET},
1824     {DISPID_GLOBAL_VBOKONLY,           Global_vbOKOnly, BP_GET},
1825     {DISPID_GLOBAL_VBOKCANCEL,         Global_vbOKCancel, BP_GET},
1826     {DISPID_GLOBAL_VBABORTRETRYIGNORE, Global_vbAbortRetryIgnore, BP_GET},
1827     {DISPID_GLOBAL_VBYESNOCANCEL,      Global_vbYesNoCancel, BP_GET},
1828     {DISPID_GLOBAL_VBYESNO,            Global_vbYesNo, BP_GET},
1829     {DISPID_GLOBAL_VBRETRYCANCEL,      Global_vbRetryCancel, BP_GET},
1830     {DISPID_GLOBAL_VBCRITICAL,         Global_vbCritical, BP_GET},
1831     {DISPID_GLOBAL_VBQUESTION,         Global_vbQuestion, BP_GET},
1832     {DISPID_GLOBAL_VBEXCLAMATION,      Global_vbExclamation, BP_GET},
1833     {DISPID_GLOBAL_VBINFORMATION,      Global_vbInformation, BP_GET},
1834     {DISPID_GLOBAL_VBDEFAULTBUTTON1,   Global_vbDefaultButton1, BP_GET},
1835     {DISPID_GLOBAL_VBDEFAULTBUTTON2,   Global_vbDefaultButton2, BP_GET},
1836     {DISPID_GLOBAL_VBDEFAULTBUTTON3,   Global_vbDefaultButton3, BP_GET},
1837     {DISPID_GLOBAL_VBDEFAULTBUTTON4,   Global_vbDefaultButton4, BP_GET},
1838     {DISPID_GLOBAL_VBAPPLICATIONMODAL, Global_vbApplicationModal, BP_GET},
1839     {DISPID_GLOBAL_VBSYSTEMMODAL,      Global_vbSystemModal, BP_GET},
1840     {DISPID_GLOBAL_VBOK,               Global_vbOK, BP_GET},
1841     {DISPID_GLOBAL_VBCANCEL,           Global_vbCancel, BP_GET},
1842     {DISPID_GLOBAL_VBABORT,            Global_vbAbort, BP_GET},
1843     {DISPID_GLOBAL_VBRETRY,            Global_vbRetry, BP_GET},
1844     {DISPID_GLOBAL_VBIGNORE,           Global_vbIgnore, BP_GET},
1845     {DISPID_GLOBAL_VBYES,              Global_vbYes, BP_GET},
1846     {DISPID_GLOBAL_VBNO,               Global_vbNo, BP_GET},
1847     {DISPID_GLOBAL_VBEMPTY,            Global_vbEmpty, BP_GET},
1848     {DISPID_GLOBAL_VBNULL,             Global_vbNull, BP_GET},
1849     {DISPID_GLOBAL_VBINTEGER,          Global_vbInteger, BP_GET},
1850     {DISPID_GLOBAL_VBLONG,             Global_vbLong, BP_GET},
1851     {DISPID_GLOBAL_VBSINGLE,           Global_vbSingle, BP_GET},
1852     {DISPID_GLOBAL_VBDOUBLE,           Global_vbDouble, BP_GET},
1853     {DISPID_GLOBAL_VBCURRENCY,         Global_vbCurrency, BP_GET},
1854     {DISPID_GLOBAL_VBDATE,             Global_vbDate, BP_GET},
1855     {DISPID_GLOBAL_VBSTRING,           Global_vbString, BP_GET},
1856     {DISPID_GLOBAL_VBOBJECT,           Global_vbObject, BP_GET},
1857     {DISPID_GLOBAL_VBERROR,            Global_vbError, BP_GET},
1858     {DISPID_GLOBAL_VBBOOLEAN,          Global_vbBoolean, BP_GET},
1859     {DISPID_GLOBAL_VBVARIANT,          Global_vbVariant, BP_GET},
1860     {DISPID_GLOBAL_VBDATAOBJECT,       Global_vbDataObject, BP_GET},
1861     {DISPID_GLOBAL_VBDECIMAL,          Global_vbDecimal, BP_GET},
1862     {DISPID_GLOBAL_VBBYTE,             Global_vbByte, BP_GET},
1863     {DISPID_GLOBAL_VBARRAY,            Global_vbArray, BP_GET},
1864     {DISPID_GLOBAL_VBTRUE,             Global_vbTrue, BP_GET},
1865     {DISPID_GLOBAL_VBFALSE,            Global_vbFalse, BP_GET},
1866     {DISPID_GLOBAL_VBUSEDEFAULT,       Global_vbUseDefault, BP_GET},
1867     {DISPID_GLOBAL_VBBINARYCOMPARE,    Global_vbBinaryCompare, BP_GET},
1868     {DISPID_GLOBAL_VBTEXTCOMPARE,      Global_vbTextCompare, BP_GET},
1869     {DISPID_GLOBAL_VBDATABASECOMPARE,  Global_vbDatabaseCompare, BP_GET},
1870     {DISPID_GLOBAL_VBGENERALDATE,      Global_vbGeneralDate, BP_GET},
1871     {DISPID_GLOBAL_VBLONGDATE,         Global_vbLongDate, BP_GET},
1872     {DISPID_GLOBAL_VBSHORTDATE,        Global_vbShortDate, BP_GET},
1873     {DISPID_GLOBAL_VBLONGTIME,         Global_vbLongTime, BP_GET},
1874     {DISPID_GLOBAL_VBSHORTTIME,        Global_vbShortTime, BP_GET},
1875     {DISPID_GLOBAL_VBOBJECTERROR,      Global_vbObjectError, BP_GET},
1876     {DISPID_GLOBAL_VBBLACK,            Global_vbBlack, BP_GET},
1877     {DISPID_GLOBAL_VBBLUE,             Global_vbBlue, BP_GET},
1878     {DISPID_GLOBAL_VBCYAN,             Global_vbCyan, BP_GET},
1879     {DISPID_GLOBAL_VBGREEN,            Global_vbGreen, BP_GET},
1880     {DISPID_GLOBAL_VBMAGENTA,          Global_vbMagenta, BP_GET},
1881     {DISPID_GLOBAL_VBRED,              Global_vbRed, BP_GET},
1882     {DISPID_GLOBAL_VBWHITE,            Global_vbWhite, BP_GET},
1883     {DISPID_GLOBAL_VBYELLOW,           Global_vbYellow, BP_GET},
1884     {DISPID_GLOBAL_VBCR,               Global_vbCr, BP_GET},
1885     {DISPID_GLOBAL_VBCRLF,             Global_vbCrLf, BP_GET},
1886     {DISPID_GLOBAL_VBNEWLINE,          Global_vbNewLine, BP_GET},
1887     {DISPID_GLOBAL_VBFORMFEED,         Global_vbFormFeed, BP_GET},
1888     {DISPID_GLOBAL_VBLF,               Global_vbLf, BP_GET},
1889     {DISPID_GLOBAL_VBNULLCHAR,         Global_vbNullChar, BP_GET},
1890     {DISPID_GLOBAL_VBNULLSTRING,       Global_vbNullString, BP_GET},
1891     {DISPID_GLOBAL_VBTAB,              Global_vbTab, BP_GET},
1892     {DISPID_GLOBAL_VBVERTICALTAB,      Global_vbVerticalTab, BP_GET},
1893     {DISPID_GLOBAL_CCUR,                      Global_CCur, 0, 1},
1894     {DISPID_GLOBAL_CINT,                      Global_CInt, 0, 1},
1895     {DISPID_GLOBAL_CLNG,                      Global_CLng, 0, 1},
1896     {DISPID_GLOBAL_CBOOL,                     Global_CBool, 0, 1},
1897     {DISPID_GLOBAL_CBYTE,                     Global_CByte, 0, 1},
1898     {DISPID_GLOBAL_CDATE,                     Global_CDate, 0, 1},
1899     {DISPID_GLOBAL_CDBL,                      Global_CDbl, 0, 1},
1900     {DISPID_GLOBAL_CSNG,                      Global_CSng, 0, 1},
1901     {DISPID_GLOBAL_CSTR,                      Global_CStr, 0, 1},
1902     {DISPID_GLOBAL_HEX,                       Global_Hex, 0, 1},
1903     {DISPID_GLOBAL_OCT,                       Global_Oct, 0, 1},
1904     {DISPID_GLOBAL_VARTYPE,                   Global_VarType, 0, 1},
1905     {DISPID_GLOBAL_ISDATE,                    Global_IsDate, 0, 1},
1906     {DISPID_GLOBAL_ISEMPTY,                   Global_IsEmpty, 0, 1},
1907     {DISPID_GLOBAL_ISNULL,                    Global_IsNull, 0, 1},
1908     {DISPID_GLOBAL_ISNUMERIC,                 Global_IsNumeric, 0, 1},
1909     {DISPID_GLOBAL_ISARRAY,                   Global_IsArray, 0, 1},
1910     {DISPID_GLOBAL_ISOBJECT,                  Global_IsObject, 0, 1},
1911     {DISPID_GLOBAL_ATN,                       Global_Ant, 0, 1},
1912     {DISPID_GLOBAL_COS,                       Global_Cos, 0, 1},
1913     {DISPID_GLOBAL_SIN,                       Global_Sin, 0, 1},
1914     {DISPID_GLOBAL_TAN,                       Global_Tan, 0, 1},
1915     {DISPID_GLOBAL_EXP,                       Global_Exp, 0, 1},
1916     {DISPID_GLOBAL_LOG,                       Global_Log, 0, 1},
1917     {DISPID_GLOBAL_SQR,                       Global_Sqr, 0, 1},
1918     {DISPID_GLOBAL_RANDOMIZE,                 Global_Randomize, 0, 1},
1919     {DISPID_GLOBAL_RND,                       Global_Rnd, 0, 1},
1920     {DISPID_GLOBAL_TIMER,                     Global_Timer, 0, 0},
1921     {DISPID_GLOBAL_LBOUND,                    Global_LBound, 0, 1},
1922     {DISPID_GLOBAL_UBOUND,                    Global_UBound, 0, 1},
1923     {DISPID_GLOBAL_RGB,                       Global_RGB, 0, 3},
1924     {DISPID_GLOBAL_LEN,                       Global_Len, 0, 1},
1925     {DISPID_GLOBAL_LENB,                      Global_LenB, 0, 1},
1926     {DISPID_GLOBAL_LEFT,                      Global_Left, 0, 2},
1927     {DISPID_GLOBAL_LEFTB,                     Global_LeftB, 0, 2},
1928     {DISPID_GLOBAL_RIGHT,                     Global_Right, 0, 2},
1929     {DISPID_GLOBAL_RIGHTB,                    Global_RightB, 0, 2},
1930     {DISPID_GLOBAL_MID,                       Global_Mid, 0, 2, 3},
1931     {DISPID_GLOBAL_MIDB,                      Global_MidB, 0, 2, 3},
1932     {DISPID_GLOBAL_STRCOMP,                   Global_StrComp, 0, 2, 3},
1933     {DISPID_GLOBAL_LCASE,                     Global_LCase, 0, 1},
1934     {DISPID_GLOBAL_UCASE,                     Global_UCase, 0, 1},
1935     {DISPID_GLOBAL_LTRIM,                     Global_LTrim, 0, 1},
1936     {DISPID_GLOBAL_RTRIM,                     Global_RTrim, 0, 1},
1937     {DISPID_GLOBAL_TRIM,                      Global_Trim, 0, 1},
1938     {DISPID_GLOBAL_SPACE,                     Global_Space, 0, 1},
1939     {DISPID_GLOBAL_STRING,                    Global_String, 0, 0, 2},
1940     {DISPID_GLOBAL_INSTR,                     Global_InStr, 0, 2, 4},
1941     {DISPID_GLOBAL_INSTRB,                    Global_InStrB, 0, 3, 4},
1942     {DISPID_GLOBAL_ASCB,                      Global_AscB, 0, 1},
1943     {DISPID_GLOBAL_CHRB,                      Global_ChrB, 0, 1},
1944     {DISPID_GLOBAL_ASC,                       Global_Asc, 0, 1},
1945     {DISPID_GLOBAL_CHR,                       Global_Chr, 0, 1},
1946     {DISPID_GLOBAL_ASCW,                      Global_AscW, 0, 1},
1947     {DISPID_GLOBAL_CHRW,                      Global_ChrW, 0, 1},
1948     {DISPID_GLOBAL_ABS,                       Global_Abs, 0, 1},
1949     {DISPID_GLOBAL_FIX,                       Global_Fix, 0, 1},
1950     {DISPID_GLOBAL_INT,                       Global_Int, 0, 1},
1951     {DISPID_GLOBAL_SGN,                       Global_Sgn, 0, 1},
1952     {DISPID_GLOBAL_NOW,                       Global_Now, 0, 0},
1953     {DISPID_GLOBAL_DATE,                      Global_Date, 0, 0},
1954     {DISPID_GLOBAL_TIME,                      Global_Time, 0, 0},
1955     {DISPID_GLOBAL_DAY,                       Global_Day, 0, 1},
1956     {DISPID_GLOBAL_MONTH,                     Global_Month, 0, 1},
1957     {DISPID_GLOBAL_WEEKDAY,                   Global_Weekday, 0, 1, 2},
1958     {DISPID_GLOBAL_YEAR,                      Global_Year, 0, 1},
1959     {DISPID_GLOBAL_HOUR,                      Global_Hour, 0, 1},
1960     {DISPID_GLOBAL_MINUTE,                    Global_Minute, 0, 1},
1961     {DISPID_GLOBAL_SECOND,                    Global_Second, 0, 1},
1962     {DISPID_GLOBAL_DATEVALUE,                 Global_DateValue, 0, 1},
1963     {DISPID_GLOBAL_TIMEVALUE,                 Global_TimeValue, 0, 1},
1964     {DISPID_GLOBAL_DATESERIAL,                Global_DateSerial, 0, 3},
1965     {DISPID_GLOBAL_TIMESERIAL,                Global_TimeSerial, 0, 3},
1966     {DISPID_GLOBAL_INPUTBOX,                  Global_InputBox, 0, 1, 7},
1967     {DISPID_GLOBAL_MSGBOX,                    Global_MsgBox, 0, 1, 5},
1968     {DISPID_GLOBAL_CREATEOBJECT,              Global_CreateObject, 0, 1},
1969     {DISPID_GLOBAL_GETOBJECT,                 Global_GetObject, 0, 0, 2},
1970     {DISPID_GLOBAL_DATEADD,                   Global_DateAdd, 0, 3},
1971     {DISPID_GLOBAL_DATEDIFF,                  Global_DateDiff, 0, 3, 5},
1972     {DISPID_GLOBAL_DATEPART,                  Global_DatePart, 0, 2, 4},
1973     {DISPID_GLOBAL_TYPENAME,                  Global_TypeName, 0, 1},
1974     {DISPID_GLOBAL_ARRAY,                     Global_Array, 0, 1},
1975     {DISPID_GLOBAL_ERASE,                     Global_Erase, 0, 1},
1976     {DISPID_GLOBAL_FILTER,                    Global_Filter, 0, 2, 4},
1977     {DISPID_GLOBAL_JOIN,                      Global_Join, 0, 1, 2},
1978     {DISPID_GLOBAL_SPLIT,                     Global_Split, 0, 1, 4},
1979     {DISPID_GLOBAL_REPLACE,                   Global_Replace, 0, 3, 6},
1980     {DISPID_GLOBAL_STRREVERSE,                Global_StrReverse, 0, 1},
1981     {DISPID_GLOBAL_INSTRREV,                  Global_InStrRev, 0, 2, 4},
1982     {DISPID_GLOBAL_LOADPICTURE,               Global_LoadPicture, 0, 1},
1983     {DISPID_GLOBAL_SCRIPTENGINE,              Global_ScriptEngine, 0, 0},
1984     {DISPID_GLOBAL_SCRIPTENGINEMAJORVERSION,  Global_ScriptEngineMajorVersion, 0, 0},
1985     {DISPID_GLOBAL_SCRIPTENGINEMINORVERSION,  Global_ScriptEngineMinorVersion, 0, 0},
1986     {DISPID_GLOBAL_SCRIPTENGINEBUILDVERSION,  Global_ScriptEngineBuildVersion, 0, 0},
1987     {DISPID_GLOBAL_FORMATNUMBER,              Global_FormatNumber, 0, 1, 5},
1988     {DISPID_GLOBAL_FORMATCURRENCY,            Global_FormatCurrency, 0, 1, 5},
1989     {DISPID_GLOBAL_FORMATPERCENT,             Global_FormatPercent, 0, 1, 5},
1990     {DISPID_GLOBAL_FORMATDATETIME,            Global_FormatDateTime, 0, 1, 2},
1991     {DISPID_GLOBAL_WEEKDAYNAME,               Global_WeekdayName, 0, 3},
1992     {DISPID_GLOBAL_MONTHNAME,                 Global_MonthName, 0, 1, 2},
1993     {DISPID_GLOBAL_ROUND,                     Global_Round, 0, 1, 2},
1994     {DISPID_GLOBAL_ESCAPE,                    Global_Escape, 0, 1},
1995     {DISPID_GLOBAL_UNESCAPE,                  Global_Unescape, 0, 1},
1996     {DISPID_GLOBAL_EVAL,                      Global_Eval, 0, 1},
1997     {DISPID_GLOBAL_EXECUTE,                   Global_Execute, 0, 1},
1998     {DISPID_GLOBAL_EXECUTEGLOBAL,             Global_ExecuteGlobal, 0, 1},
1999     {DISPID_GLOBAL_GETREF,                    Global_GetRef, 0, 1},
2000     {DISPID_GLOBAL_VBMSGBOXHELPBUTTON,     Global_vbMsgBoxHelpButton, BP_GET},
2001     {DISPID_GLOBAL_VBMSGBOXSETFOREGROUND,  Global_vbMsgBoxSetForeground, BP_GET},
2002     {DISPID_GLOBAL_VBMSGBOXRIGHT,          Global_vbMsgBoxRight, BP_GET},
2003     {DISPID_GLOBAL_VBMSGBOXRTLREADING,     Global_vbMsgBoxRtlReading, BP_GET}
2004 };
2005
2006 HRESULT init_global(script_ctx_t *ctx)
2007 {
2008     HRESULT hres;
2009
2010     ctx->global_desc.ctx = ctx;
2011     ctx->global_desc.builtin_prop_cnt = sizeof(global_props)/sizeof(*global_props);
2012     ctx->global_desc.builtin_props = global_props;
2013
2014     hres = get_typeinfo(GlobalObj_tid, &ctx->global_desc.typeinfo);
2015     if(FAILED(hres))
2016         return hres;
2017
2018     hres = create_vbdisp(&ctx->global_desc, &ctx->global_obj);
2019     if(FAILED(hres))
2020         return hres;
2021
2022     hres = create_script_disp(ctx, &ctx->script_obj);
2023     if(FAILED(hres))
2024         return hres;
2025
2026     return init_err(ctx);
2027 }