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