vbscript: Added Space() implementation.
[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     BSTR str;
676     int n, i;
677     HRESULT hres;
678
679     TRACE("%s\n", debugstr_variant(arg));
680
681     hres = to_int(arg, &n);
682     if(FAILED(hres))
683         return hres;
684
685     if(n < 0) {
686         FIXME("n = %d\n", n);
687         return E_NOTIMPL;
688     }
689
690     if(!res)
691         return S_OK;
692
693     str = SysAllocStringLen(NULL, n);
694     if(!str)
695         return E_OUTOFMEMORY;
696
697     for(i=0; i<n; i++)
698         str[i] = ' ';
699
700     V_VT(res) = VT_BSTR;
701     V_BSTR(res) = str;
702     return S_OK;
703 }
704
705 static HRESULT Global_String(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
706 {
707     FIXME("\n");
708     return E_NOTIMPL;
709 }
710
711 static HRESULT Global_InStr(vbdisp_t *This, VARIANT *args, unsigned args_cnt, VARIANT *res)
712 {
713     VARIANT *startv, *str1v, *str2v;
714     BSTR str1, str2;
715     int start, ret;
716     HRESULT hres;
717
718     TRACE("\n");
719
720     switch(args_cnt) {
721     case 2:
722         startv = NULL;
723         str1v = args+1;
724         str2v = args;
725         break;
726     case 3:
727         startv = args+2;
728         str1v = args+1;
729         str2v = args;
730         break;
731     case 4:
732         FIXME("unsupported compare argument %s\n", debugstr_variant(args));
733         return E_NOTIMPL;
734     default:
735         assert(0);
736     }
737
738     if(startv) {
739         hres = to_int(startv, &start);
740         if(FAILED(hres))
741             return hres;
742         if(--start < 0) {
743             FIXME("start %d\n", start);
744             return E_FAIL;
745         }
746     }else {
747         start = 0;
748     }
749
750     if(V_VT(str1v) == VT_NULL || V_VT(str2v) == VT_NULL)
751         return return_null(res);
752
753     if(V_VT(str1v) != VT_BSTR) {
754         FIXME("Unsupported str1 type %s\n", debugstr_variant(str1v));
755         return E_NOTIMPL;
756     }
757     str1 = V_BSTR(str1v);
758
759     if(V_VT(str2v) != VT_BSTR) {
760         FIXME("Unsupported str2 type %s\n", debugstr_variant(str2v));
761         return E_NOTIMPL;
762     }
763     str2 = V_BSTR(str2v);
764
765     if(start < SysStringLen(str1)) {
766         WCHAR *ptr;
767
768         ptr = strstrW(str1+start, str2);
769         ret = ptr ? ptr-str1+1 : 0;
770     }else {
771         ret = 0;
772     }
773
774     return return_int(res, ret);
775 }
776
777 static HRESULT Global_InStrB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
778 {
779     FIXME("\n");
780     return E_NOTIMPL;
781 }
782
783 static HRESULT Global_AscB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
784 {
785     FIXME("\n");
786     return E_NOTIMPL;
787 }
788
789 static HRESULT Global_ChrB(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
790 {
791     FIXME("\n");
792     return E_NOTIMPL;
793 }
794
795 static HRESULT Global_Asc(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
796 {
797     FIXME("\n");
798     return E_NOTIMPL;
799 }
800
801 static HRESULT Global_Chr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
802 {
803     FIXME("\n");
804     return E_NOTIMPL;
805 }
806
807 static HRESULT Global_AscW(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
808 {
809     FIXME("\n");
810     return E_NOTIMPL;
811 }
812
813 static HRESULT Global_ChrW(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
814 {
815     FIXME("\n");
816     return E_NOTIMPL;
817 }
818
819 static HRESULT Global_Abs(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
820 {
821     FIXME("\n");
822     return E_NOTIMPL;
823 }
824
825 static HRESULT Global_Fix(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
826 {
827     FIXME("\n");
828     return E_NOTIMPL;
829 }
830
831 static HRESULT Global_Int(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
832 {
833     FIXME("\n");
834     return E_NOTIMPL;
835 }
836
837 static HRESULT Global_Sgn(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
838 {
839     FIXME("\n");
840     return E_NOTIMPL;
841 }
842
843 static HRESULT Global_Now(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
844 {
845     FIXME("\n");
846     return E_NOTIMPL;
847 }
848
849 static HRESULT Global_Date(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
850 {
851     FIXME("\n");
852     return E_NOTIMPL;
853 }
854
855 static HRESULT Global_Time(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
856 {
857     FIXME("\n");
858     return E_NOTIMPL;
859 }
860
861 static HRESULT Global_Day(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
862 {
863     FIXME("\n");
864     return E_NOTIMPL;
865 }
866
867 static HRESULT Global_Month(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
868 {
869     FIXME("\n");
870     return E_NOTIMPL;
871 }
872
873 static HRESULT Global_Weekday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
874 {
875     FIXME("\n");
876     return E_NOTIMPL;
877 }
878
879 static HRESULT Global_Year(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
880 {
881     FIXME("\n");
882     return E_NOTIMPL;
883 }
884
885 static HRESULT Global_Hour(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
886 {
887     FIXME("\n");
888     return E_NOTIMPL;
889 }
890
891 static HRESULT Global_Minute(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
892 {
893     FIXME("\n");
894     return E_NOTIMPL;
895 }
896
897 static HRESULT Global_Second(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
898 {
899     FIXME("\n");
900     return E_NOTIMPL;
901 }
902
903 static HRESULT Global_DateValue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
904 {
905     FIXME("\n");
906     return E_NOTIMPL;
907 }
908
909 static HRESULT Global_TimeValue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
910 {
911     FIXME("\n");
912     return E_NOTIMPL;
913 }
914
915 static HRESULT Global_DateSerial(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
916 {
917     FIXME("\n");
918     return E_NOTIMPL;
919 }
920
921 static HRESULT Global_TimeSerial(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
922 {
923     FIXME("\n");
924     return E_NOTIMPL;
925 }
926
927 static HRESULT Global_InputBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
928 {
929     FIXME("\n");
930     return E_NOTIMPL;
931 }
932
933 static HRESULT Global_MsgBox(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
934 {
935     FIXME("\n");
936     return E_NOTIMPL;
937 }
938
939 static HRESULT Global_CreateObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
940 {
941     IUnknown *obj;
942     HRESULT hres;
943
944     TRACE("(%s)\n", debugstr_variant(arg));
945
946     if(V_VT(arg) != VT_BSTR) {
947         FIXME("non-bstr arg\n");
948         return E_INVALIDARG;
949     }
950
951     obj = create_object(This->desc->ctx, V_BSTR(arg));
952     if(!obj)
953         return VB_E_CANNOT_CREATE_OBJ;
954
955     if(res) {
956         hres = IUnknown_QueryInterface(obj, &IID_IDispatch, (void**)&V_DISPATCH(res));
957         if(FAILED(hres))
958             return hres;
959
960         V_VT(res) = VT_DISPATCH;
961     }
962
963     IUnknown_Release(obj);
964     return S_OK;
965 }
966
967 static HRESULT Global_GetObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
968 {
969     FIXME("\n");
970     return E_NOTIMPL;
971 }
972
973 static HRESULT Global_DateAdd(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
974 {
975     FIXME("\n");
976     return E_NOTIMPL;
977 }
978
979 static HRESULT Global_DateDiff(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
980 {
981     FIXME("\n");
982     return E_NOTIMPL;
983 }
984
985 static HRESULT Global_DatePart(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
986 {
987     FIXME("\n");
988     return E_NOTIMPL;
989 }
990
991 static HRESULT Global_TypeName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
992 {
993     FIXME("\n");
994     return E_NOTIMPL;
995 }
996
997 static HRESULT Global_Array(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
998 {
999     FIXME("\n");
1000     return E_NOTIMPL;
1001 }
1002
1003 static HRESULT Global_Erase(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1004 {
1005     FIXME("\n");
1006     return E_NOTIMPL;
1007 }
1008
1009 static HRESULT Global_Filter(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1010 {
1011     FIXME("\n");
1012     return E_NOTIMPL;
1013 }
1014
1015 static HRESULT Global_Join(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1016 {
1017     FIXME("\n");
1018     return E_NOTIMPL;
1019 }
1020
1021 static HRESULT Global_Split(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1022 {
1023     FIXME("\n");
1024     return E_NOTIMPL;
1025 }
1026
1027 static HRESULT Global_Replace(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1028 {
1029     FIXME("\n");
1030     return E_NOTIMPL;
1031 }
1032
1033 static HRESULT Global_StrReverse(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1034 {
1035     FIXME("\n");
1036     return E_NOTIMPL;
1037 }
1038
1039 static HRESULT Global_InStrRev(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1040 {
1041     FIXME("\n");
1042     return E_NOTIMPL;
1043 }
1044
1045 static HRESULT Global_LoadPicture(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1046 {
1047     FIXME("\n");
1048     return E_NOTIMPL;
1049 }
1050
1051 static HRESULT Global_ScriptEngine(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1052 {
1053     FIXME("\n");
1054     return E_NOTIMPL;
1055 }
1056
1057 static HRESULT Global_ScriptEngineMajorVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1058 {
1059     FIXME("\n");
1060     return E_NOTIMPL;
1061 }
1062
1063 static HRESULT Global_ScriptEngineMinorVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1064 {
1065     FIXME("\n");
1066     return E_NOTIMPL;
1067 }
1068
1069 static HRESULT Global_ScriptEngineBuildVersion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1070 {
1071     FIXME("\n");
1072     return E_NOTIMPL;
1073 }
1074
1075 static HRESULT Global_FormatNumber(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1076 {
1077     FIXME("\n");
1078     return E_NOTIMPL;
1079 }
1080
1081 static HRESULT Global_FormatCurrency(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1082 {
1083     FIXME("\n");
1084     return E_NOTIMPL;
1085 }
1086
1087 static HRESULT Global_FormatPercent(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1088 {
1089     FIXME("\n");
1090     return E_NOTIMPL;
1091 }
1092
1093 static HRESULT Global_FormatDateTime(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1094 {
1095     FIXME("\n");
1096     return E_NOTIMPL;
1097 }
1098
1099 static HRESULT Global_WeekdayName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1100 {
1101     FIXME("\n");
1102     return E_NOTIMPL;
1103 }
1104
1105 static HRESULT Global_MonthName(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1106 {
1107     FIXME("\n");
1108     return E_NOTIMPL;
1109 }
1110
1111 static HRESULT Global_Round(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1112 {
1113     FIXME("\n");
1114     return E_NOTIMPL;
1115 }
1116
1117 static HRESULT Global_Escape(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1118 {
1119     FIXME("\n");
1120     return E_NOTIMPL;
1121 }
1122
1123 static HRESULT Global_Unescape(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1124 {
1125     FIXME("\n");
1126     return E_NOTIMPL;
1127 }
1128
1129 static HRESULT Global_Eval(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1130 {
1131     FIXME("\n");
1132     return E_NOTIMPL;
1133 }
1134
1135 static HRESULT Global_Execute(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1136 {
1137     FIXME("\n");
1138     return E_NOTIMPL;
1139 }
1140
1141 static HRESULT Global_ExecuteGlobal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1142 {
1143     FIXME("\n");
1144     return E_NOTIMPL;
1145 }
1146
1147 static HRESULT Global_GetRef(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1148 {
1149     FIXME("\n");
1150     return E_NOTIMPL;
1151 }
1152
1153 static HRESULT Global_vbUseSystem(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1154 {
1155     FIXME("\n");
1156     return E_NOTIMPL;
1157 }
1158
1159 static HRESULT Global_vbUseSystemDayOfWeek(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1160 {
1161     FIXME("\n");
1162     return E_NOTIMPL;
1163 }
1164
1165 static HRESULT Global_vbSunday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1166 {
1167     TRACE("\n");
1168     return return_short(res, 1);
1169 }
1170
1171 static HRESULT Global_vbMonday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1172 {
1173     TRACE("\n");
1174     return return_short(res, 2);
1175 }
1176
1177 static HRESULT Global_vbTuesday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1178 {
1179     TRACE("\n");
1180     return return_short(res, 3);
1181 }
1182
1183 static HRESULT Global_vbWednesday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1184 {
1185     TRACE("\n");
1186     return return_short(res, 4);
1187 }
1188
1189 static HRESULT Global_vbThursday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1190 {
1191     TRACE("\n");
1192     return return_short(res, 5);
1193 }
1194
1195 static HRESULT Global_vbFriday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1196 {
1197     TRACE("\n");
1198     return return_short(res, 6);
1199 }
1200
1201 static HRESULT Global_vbSaturday(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1202 {
1203     TRACE("\n");
1204     return return_short(res, 7);
1205 }
1206
1207 static HRESULT Global_vbFirstJan1(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1208 {
1209     FIXME("\n");
1210     return E_NOTIMPL;
1211 }
1212
1213 static HRESULT Global_vbFirstFourDays(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1214 {
1215     FIXME("\n");
1216     return E_NOTIMPL;
1217 }
1218
1219 static HRESULT Global_vbFirstFullWeek(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1220 {
1221     FIXME("\n");
1222     return E_NOTIMPL;
1223 }
1224
1225 static HRESULT Global_vbOKOnly(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1226 {
1227     FIXME("\n");
1228     return E_NOTIMPL;
1229 }
1230
1231 static HRESULT Global_vbOKCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1232 {
1233     FIXME("\n");
1234     return E_NOTIMPL;
1235 }
1236
1237 static HRESULT Global_vbAbortRetryIgnore(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1238 {
1239     FIXME("\n");
1240     return E_NOTIMPL;
1241 }
1242
1243 static HRESULT Global_vbYesNoCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1244 {
1245     FIXME("\n");
1246     return E_NOTIMPL;
1247 }
1248
1249 static HRESULT Global_vbYesNo(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1250 {
1251     FIXME("\n");
1252     return E_NOTIMPL;
1253 }
1254
1255 static HRESULT Global_vbRetryCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1256 {
1257     FIXME("\n");
1258     return E_NOTIMPL;
1259 }
1260
1261 static HRESULT Global_vbCritical(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1262 {
1263     FIXME("\n");
1264     return E_NOTIMPL;
1265 }
1266
1267 static HRESULT Global_vbQuestion(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1268 {
1269     FIXME("\n");
1270     return E_NOTIMPL;
1271 }
1272
1273 static HRESULT Global_vbExclamation(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1274 {
1275     FIXME("\n");
1276     return E_NOTIMPL;
1277 }
1278
1279 static HRESULT Global_vbInformation(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1280 {
1281     FIXME("\n");
1282     return E_NOTIMPL;
1283 }
1284
1285 static HRESULT Global_vbDefaultButton1(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1286 {
1287     FIXME("\n");
1288     return E_NOTIMPL;
1289 }
1290
1291 static HRESULT Global_vbDefaultButton2(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1292 {
1293     FIXME("\n");
1294     return E_NOTIMPL;
1295 }
1296
1297 static HRESULT Global_vbDefaultButton3(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1298 {
1299     FIXME("\n");
1300     return E_NOTIMPL;
1301 }
1302
1303 static HRESULT Global_vbDefaultButton4(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1304 {
1305     FIXME("\n");
1306     return E_NOTIMPL;
1307 }
1308
1309 static HRESULT Global_vbApplicationModal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1310 {
1311     FIXME("\n");
1312     return E_NOTIMPL;
1313 }
1314
1315 static HRESULT Global_vbSystemModal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1316 {
1317     FIXME("\n");
1318     return E_NOTIMPL;
1319 }
1320
1321 static HRESULT Global_vbOK(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1322 {
1323     FIXME("\n");
1324     return E_NOTIMPL;
1325 }
1326
1327 static HRESULT Global_vbCancel(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1328 {
1329     FIXME("\n");
1330     return E_NOTIMPL;
1331 }
1332
1333 static HRESULT Global_vbAbort(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1334 {
1335     FIXME("\n");
1336     return E_NOTIMPL;
1337 }
1338
1339 static HRESULT Global_vbRetry(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1340 {
1341     FIXME("\n");
1342     return E_NOTIMPL;
1343 }
1344
1345 static HRESULT Global_vbIgnore(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1346 {
1347     FIXME("\n");
1348     return E_NOTIMPL;
1349 }
1350
1351 static HRESULT Global_vbYes(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1352 {
1353     FIXME("\n");
1354     return E_NOTIMPL;
1355 }
1356
1357 static HRESULT Global_vbNo(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1358 {
1359     FIXME("\n");
1360     return E_NOTIMPL;
1361 }
1362
1363 static HRESULT Global_vbEmpty(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1364 {
1365     FIXME("\n");
1366     return E_NOTIMPL;
1367 }
1368
1369 static HRESULT Global_vbNull(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1370 {
1371     FIXME("\n");
1372     return E_NOTIMPL;
1373 }
1374
1375 static HRESULT Global_vbInteger(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1376 {
1377     FIXME("\n");
1378     return E_NOTIMPL;
1379 }
1380
1381 static HRESULT Global_vbLong(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1382 {
1383     FIXME("\n");
1384     return E_NOTIMPL;
1385 }
1386
1387 static HRESULT Global_vbSingle(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1388 {
1389     FIXME("\n");
1390     return E_NOTIMPL;
1391 }
1392
1393 static HRESULT Global_vbDouble(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1394 {
1395     FIXME("\n");
1396     return E_NOTIMPL;
1397 }
1398
1399 static HRESULT Global_vbCurrency(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1400 {
1401     FIXME("\n");
1402     return E_NOTIMPL;
1403 }
1404
1405 static HRESULT Global_vbDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1406 {
1407     FIXME("\n");
1408     return E_NOTIMPL;
1409 }
1410
1411 static HRESULT Global_vbString(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1412 {
1413     FIXME("\n");
1414     return E_NOTIMPL;
1415 }
1416
1417 static HRESULT Global_vbObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1418 {
1419     FIXME("\n");
1420     return E_NOTIMPL;
1421 }
1422
1423 static HRESULT Global_vbError(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1424 {
1425     FIXME("\n");
1426     return E_NOTIMPL;
1427 }
1428
1429 static HRESULT Global_vbBoolean(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1430 {
1431     FIXME("\n");
1432     return E_NOTIMPL;
1433 }
1434
1435 static HRESULT Global_vbVariant(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1436 {
1437     FIXME("\n");
1438     return E_NOTIMPL;
1439 }
1440
1441 static HRESULT Global_vbDataObject(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1442 {
1443     FIXME("\n");
1444     return E_NOTIMPL;
1445 }
1446
1447 static HRESULT Global_vbDecimal(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1448 {
1449     FIXME("\n");
1450     return E_NOTIMPL;
1451 }
1452
1453 static HRESULT Global_vbByte(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1454 {
1455     FIXME("\n");
1456     return E_NOTIMPL;
1457 }
1458
1459 static HRESULT Global_vbArray(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1460 {
1461     FIXME("\n");
1462     return E_NOTIMPL;
1463 }
1464
1465 static HRESULT Global_vbTrue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1466 {
1467     FIXME("\n");
1468     return E_NOTIMPL;
1469 }
1470
1471 static HRESULT Global_vbFalse(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1472 {
1473     FIXME("\n");
1474     return E_NOTIMPL;
1475 }
1476
1477 static HRESULT Global_vbUseDefault(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1478 {
1479     FIXME("\n");
1480     return E_NOTIMPL;
1481 }
1482
1483 static HRESULT Global_vbBinaryCompare(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1484 {
1485     FIXME("\n");
1486     return E_NOTIMPL;
1487 }
1488
1489 static HRESULT Global_vbTextCompare(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1490 {
1491     FIXME("\n");
1492     return E_NOTIMPL;
1493 }
1494
1495 static HRESULT Global_vbDatabaseCompare(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1496 {
1497     FIXME("\n");
1498     return E_NOTIMPL;
1499 }
1500
1501 static HRESULT Global_vbGeneralDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1502 {
1503     FIXME("\n");
1504     return E_NOTIMPL;
1505 }
1506
1507 static HRESULT Global_vbLongDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1508 {
1509     FIXME("\n");
1510     return E_NOTIMPL;
1511 }
1512
1513 static HRESULT Global_vbShortDate(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1514 {
1515     FIXME("\n");
1516     return E_NOTIMPL;
1517 }
1518
1519 static HRESULT Global_vbLongTime(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1520 {
1521     FIXME("\n");
1522     return E_NOTIMPL;
1523 }
1524
1525 static HRESULT Global_vbShortTime(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1526 {
1527     FIXME("\n");
1528     return E_NOTIMPL;
1529 }
1530
1531 static HRESULT Global_vbObjectError(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1532 {
1533     FIXME("\n");
1534     return E_NOTIMPL;
1535 }
1536
1537 static HRESULT Global_vbBlack(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1538 {
1539     FIXME("\n");
1540     return E_NOTIMPL;
1541 }
1542
1543 static HRESULT Global_vbBlue(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1544 {
1545     FIXME("\n");
1546     return E_NOTIMPL;
1547 }
1548
1549 static HRESULT Global_vbCyan(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1550 {
1551     FIXME("\n");
1552     return E_NOTIMPL;
1553 }
1554
1555 static HRESULT Global_vbGreen(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1556 {
1557     FIXME("\n");
1558     return E_NOTIMPL;
1559 }
1560
1561 static HRESULT Global_vbMagenta(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1562 {
1563     FIXME("\n");
1564     return E_NOTIMPL;
1565 }
1566
1567 static HRESULT Global_vbRed(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1568 {
1569     FIXME("\n");
1570     return E_NOTIMPL;
1571 }
1572
1573 static HRESULT Global_vbWhite(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1574 {
1575     FIXME("\n");
1576     return E_NOTIMPL;
1577 }
1578
1579 static HRESULT Global_vbYellow(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1580 {
1581     FIXME("\n");
1582     return E_NOTIMPL;
1583 }
1584
1585 static HRESULT Global_vbCr(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1586 {
1587     FIXME("\n");
1588     return E_NOTIMPL;
1589 }
1590
1591 static HRESULT Global_vbCrLf(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1592 {
1593     FIXME("\n");
1594     return E_NOTIMPL;
1595 }
1596
1597 static HRESULT Global_vbNewLine(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1598 {
1599     FIXME("\n");
1600     return E_NOTIMPL;
1601 }
1602
1603 static HRESULT Global_vbFormFeed(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1604 {
1605     FIXME("\n");
1606     return E_NOTIMPL;
1607 }
1608
1609 static HRESULT Global_vbLf(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1610 {
1611     FIXME("\n");
1612     return E_NOTIMPL;
1613 }
1614
1615 static HRESULT Global_vbNullChar(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1616 {
1617     FIXME("\n");
1618     return E_NOTIMPL;
1619 }
1620
1621 static HRESULT Global_vbNullString(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1622 {
1623     FIXME("\n");
1624     return E_NOTIMPL;
1625 }
1626
1627 static HRESULT Global_vbTab(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1628 {
1629     FIXME("\n");
1630     return E_NOTIMPL;
1631 }
1632
1633 static HRESULT Global_vbVerticalTab(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1634 {
1635     FIXME("\n");
1636     return E_NOTIMPL;
1637 }
1638
1639 static HRESULT Global_vbMsgBoxHelpButton(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1640 {
1641     FIXME("\n");
1642     return E_NOTIMPL;
1643 }
1644
1645 static HRESULT Global_vbMsgBoxSetForeground(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1646 {
1647     FIXME("\n");
1648     return E_NOTIMPL;
1649 }
1650
1651 static HRESULT Global_vbMsgBoxRight(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1652 {
1653     FIXME("\n");
1654     return E_NOTIMPL;
1655 }
1656
1657 static HRESULT Global_vbMsgBoxRtlReading(vbdisp_t *This, VARIANT *arg, unsigned args_cnt, VARIANT *res)
1658 {
1659     FIXME("\n");
1660     return E_NOTIMPL;
1661 }
1662
1663 static const builtin_prop_t global_props[] = {
1664     {DISPID_GLOBAL_VBUSESYSTEM,        Global_vbUseSystem, BP_GET},
1665     {DISPID_GLOBAL_USESYSTEMDAYOFWEEK, Global_vbUseSystemDayOfWeek, BP_GET},
1666     {DISPID_GLOBAL_VBSUNDAY,           Global_vbSunday, BP_GET},
1667     {DISPID_GLOBAL_VBMONDAY,           Global_vbMonday, BP_GET},
1668     {DISPID_GLOBAL_VBTUESDAY,          Global_vbTuesday, BP_GET},
1669     {DISPID_GLOBAL_VBWEDNESDAY,        Global_vbWednesday, BP_GET},
1670     {DISPID_GLOBAL_VBTHURSDAY,         Global_vbThursday, BP_GET},
1671     {DISPID_GLOBAL_VBFRIDAY,           Global_vbFriday, BP_GET},
1672     {DISPID_GLOBAL_VBSATURDAY,         Global_vbSaturday, BP_GET},
1673     {DISPID_GLOBAL_VBFIRSTJAN1,        Global_vbFirstJan1, BP_GET},
1674     {DISPID_GLOBAL_VBFIRSTFOURDAYS,    Global_vbFirstFourDays, BP_GET},
1675     {DISPID_GLOBAL_VBFIRSTFULLWEEK,    Global_vbFirstFullWeek, BP_GET},
1676     {DISPID_GLOBAL_VBOKONLY,           Global_vbOKOnly, BP_GET},
1677     {DISPID_GLOBAL_VBOKCANCEL,         Global_vbOKCancel, BP_GET},
1678     {DISPID_GLOBAL_VBABORTRETRYIGNORE, Global_vbAbortRetryIgnore, BP_GET},
1679     {DISPID_GLOBAL_VBYESNOCANCEL,      Global_vbYesNoCancel, BP_GET},
1680     {DISPID_GLOBAL_VBYESNO,            Global_vbYesNo, BP_GET},
1681     {DISPID_GLOBAL_VBRETRYCANCEL,      Global_vbRetryCancel, BP_GET},
1682     {DISPID_GLOBAL_VBCRITICAL,         Global_vbCritical, BP_GET},
1683     {DISPID_GLOBAL_VBQUESTION,         Global_vbQuestion, BP_GET},
1684     {DISPID_GLOBAL_VBEXCLAMATION,      Global_vbExclamation, BP_GET},
1685     {DISPID_GLOBAL_VBINFORMATION,      Global_vbInformation, BP_GET},
1686     {DISPID_GLOBAL_VBDEFAULTBUTTON1,   Global_vbDefaultButton1, BP_GET},
1687     {DISPID_GLOBAL_VBDEFAULTBUTTON2,   Global_vbDefaultButton2, BP_GET},
1688     {DISPID_GLOBAL_VBDEFAULTBUTTON3,   Global_vbDefaultButton3, BP_GET},
1689     {DISPID_GLOBAL_VBDEFAULTBUTTON4,   Global_vbDefaultButton4, BP_GET},
1690     {DISPID_GLOBAL_VBAPPLICATIONMODAL, Global_vbApplicationModal, BP_GET},
1691     {DISPID_GLOBAL_VBSYSTEMMODAL,      Global_vbSystemModal, BP_GET},
1692     {DISPID_GLOBAL_VBOK,               Global_vbOK, BP_GET},
1693     {DISPID_GLOBAL_VBCANCEL,           Global_vbCancel, BP_GET},
1694     {DISPID_GLOBAL_VBABORT,            Global_vbAbort, BP_GET},
1695     {DISPID_GLOBAL_VBRETRY,            Global_vbRetry, BP_GET},
1696     {DISPID_GLOBAL_VBIGNORE,           Global_vbIgnore, BP_GET},
1697     {DISPID_GLOBAL_VBYES,              Global_vbYes, BP_GET},
1698     {DISPID_GLOBAL_VBNO,               Global_vbNo, BP_GET},
1699     {DISPID_GLOBAL_VBEMPTY,            Global_vbEmpty, BP_GET},
1700     {DISPID_GLOBAL_VBNULL,             Global_vbNull, BP_GET},
1701     {DISPID_GLOBAL_VBINTEGER,          Global_vbInteger, BP_GET},
1702     {DISPID_GLOBAL_VBLONG,             Global_vbLong, BP_GET},
1703     {DISPID_GLOBAL_VBSINGLE,           Global_vbSingle, BP_GET},
1704     {DISPID_GLOBAL_VBDOUBLE,           Global_vbDouble, BP_GET},
1705     {DISPID_GLOBAL_VBCURRENCY,         Global_vbCurrency, BP_GET},
1706     {DISPID_GLOBAL_VBDATE,             Global_vbDate, BP_GET},
1707     {DISPID_GLOBAL_VBSTRING,           Global_vbString, BP_GET},
1708     {DISPID_GLOBAL_VBOBJECT,           Global_vbObject, BP_GET},
1709     {DISPID_GLOBAL_VBERROR,            Global_vbError, BP_GET},
1710     {DISPID_GLOBAL_VBBOOLEAN,          Global_vbBoolean, BP_GET},
1711     {DISPID_GLOBAL_VBVARIANT,          Global_vbVariant, BP_GET},
1712     {DISPID_GLOBAL_VBDATAOBJECT,       Global_vbDataObject, BP_GET},
1713     {DISPID_GLOBAL_VBDECIMAL,          Global_vbDecimal, BP_GET},
1714     {DISPID_GLOBAL_VBBYTE,             Global_vbByte, BP_GET},
1715     {DISPID_GLOBAL_VBARRAY,            Global_vbArray, BP_GET},
1716     {DISPID_GLOBAL_VBTRUE,             Global_vbTrue, BP_GET},
1717     {DISPID_GLOBAL_VBFALSE,            Global_vbFalse, BP_GET},
1718     {DISPID_GLOBAL_VBUSEDEFAULT,       Global_vbUseDefault, BP_GET},
1719     {DISPID_GLOBAL_VBBINARYCOMPARE,    Global_vbBinaryCompare, BP_GET},
1720     {DISPID_GLOBAL_VBTEXTCOMPARE,      Global_vbTextCompare, BP_GET},
1721     {DISPID_GLOBAL_VBDATABASECOMPARE,  Global_vbDatabaseCompare, BP_GET},
1722     {DISPID_GLOBAL_VBGENERALDATE,      Global_vbGeneralDate, BP_GET},
1723     {DISPID_GLOBAL_VBLONGDATE,         Global_vbLongDate, BP_GET},
1724     {DISPID_GLOBAL_VBSHORTDATE,        Global_vbShortDate, BP_GET},
1725     {DISPID_GLOBAL_VBLONGTIME,         Global_vbLongTime, BP_GET},
1726     {DISPID_GLOBAL_VBSHORTTIME,        Global_vbShortTime, BP_GET},
1727     {DISPID_GLOBAL_VBOBJECTERROR,      Global_vbObjectError, BP_GET},
1728     {DISPID_GLOBAL_VBBLACK,            Global_vbBlack, BP_GET},
1729     {DISPID_GLOBAL_VBBLUE,             Global_vbBlue, BP_GET},
1730     {DISPID_GLOBAL_VBCYAN,             Global_vbCyan, BP_GET},
1731     {DISPID_GLOBAL_VBGREEN,            Global_vbGreen, BP_GET},
1732     {DISPID_GLOBAL_VBMAGENTA,          Global_vbMagenta, BP_GET},
1733     {DISPID_GLOBAL_VBRED,              Global_vbRed, BP_GET},
1734     {DISPID_GLOBAL_VBWHITE,            Global_vbWhite, BP_GET},
1735     {DISPID_GLOBAL_VBYELLOW,           Global_vbYellow, BP_GET},
1736     {DISPID_GLOBAL_VBCR,               Global_vbCr, BP_GET},
1737     {DISPID_GLOBAL_VBCRLF,             Global_vbCrLf, BP_GET},
1738     {DISPID_GLOBAL_VBNEWLINE,          Global_vbNewLine, BP_GET},
1739     {DISPID_GLOBAL_VBFORMFEED,         Global_vbFormFeed, BP_GET},
1740     {DISPID_GLOBAL_VBLF,               Global_vbLf, BP_GET},
1741     {DISPID_GLOBAL_VBNULLCHAR,         Global_vbNullChar, BP_GET},
1742     {DISPID_GLOBAL_VBNULLSTRING,       Global_vbNullString, BP_GET},
1743     {DISPID_GLOBAL_VBTAB,              Global_vbTab, BP_GET},
1744     {DISPID_GLOBAL_VBVERTICALTAB,      Global_vbVerticalTab, BP_GET},
1745     {DISPID_GLOBAL_CCUR,                      Global_CCur, 0, 1},
1746     {DISPID_GLOBAL_CINT,                      Global_CInt, 0, 1},
1747     {DISPID_GLOBAL_CLNG,                      Global_CLng, 0, 1},
1748     {DISPID_GLOBAL_CBOOL,                     Global_CBool, 0, 1},
1749     {DISPID_GLOBAL_CBYTE,                     Global_CByte, 0, 1},
1750     {DISPID_GLOBAL_CDATE,                     Global_CDate, 0, 1},
1751     {DISPID_GLOBAL_CDBL,                      Global_CDbl, 0, 1},
1752     {DISPID_GLOBAL_CSNG,                      Global_CSng, 0, 1},
1753     {DISPID_GLOBAL_CSTR,                      Global_CStr, 0, 1},
1754     {DISPID_GLOBAL_HEX,                       Global_Hex, 0, 1},
1755     {DISPID_GLOBAL_OCT,                       Global_Oct, 0, 1},
1756     {DISPID_GLOBAL_VARTYPE,                   Global_VarType, 0, 1},
1757     {DISPID_GLOBAL_ISDATE,                    Global_IsDate, 0, 1},
1758     {DISPID_GLOBAL_ISEMPTY,                   Global_IsEmpty, 0, 1},
1759     {DISPID_GLOBAL_ISNULL,                    Global_IsNull, 0, 1},
1760     {DISPID_GLOBAL_ISNUMERIC,                 Global_IsNumeric, 0, 1},
1761     {DISPID_GLOBAL_ISARRAY,                   Global_IsArray, 0, 1},
1762     {DISPID_GLOBAL_ISOBJECT,                  Global_IsObject, 0, 1},
1763     {DISPID_GLOBAL_ATN,                       Global_Ant, 0, 1},
1764     {DISPID_GLOBAL_COS,                       Global_Cos, 0, 1},
1765     {DISPID_GLOBAL_SIN,                       Global_Sin, 0, 1},
1766     {DISPID_GLOBAL_TAN,                       Global_Tan, 0, 1},
1767     {DISPID_GLOBAL_EXP,                       Global_Exp, 0, 1},
1768     {DISPID_GLOBAL_LOG,                       Global_Log, 0, 1},
1769     {DISPID_GLOBAL_SQR,                       Global_Sqr, 0, 1},
1770     {DISPID_GLOBAL_RANDOMIZE,                 Global_Randomize, 0, 1},
1771     {DISPID_GLOBAL_RND,                       Global_Rnd, 0, 1},
1772     {DISPID_GLOBAL_TIMER,                     Global_Timer, 0, 0},
1773     {DISPID_GLOBAL_LBOUND,                    Global_LBound, 0, 1},
1774     {DISPID_GLOBAL_UBOUND,                    Global_UBound, 0, 1},
1775     {DISPID_GLOBAL_RGB,                       Global_RGB, 0, 3},
1776     {DISPID_GLOBAL_LEN,                       Global_Len, 0, 1},
1777     {DISPID_GLOBAL_LENB,                      Global_LenB, 0, 1},
1778     {DISPID_GLOBAL_LEFT,                      Global_Left, 0, 2},
1779     {DISPID_GLOBAL_LEFTB,                     Global_LeftB, 0, 2},
1780     {DISPID_GLOBAL_RIGHT,                     Global_Right, 0, 2},
1781     {DISPID_GLOBAL_RIGHTB,                    Global_RightB, 0, 2},
1782     {DISPID_GLOBAL_MID,                       Global_Mid, 0, 2, 3},
1783     {DISPID_GLOBAL_MIDB,                      Global_MidB, 0, 2, 3},
1784     {DISPID_GLOBAL_STRCOMP,                   Global_StrComp, 0, 2, 3},
1785     {DISPID_GLOBAL_LCASE,                     Global_LCase, 0, 1},
1786     {DISPID_GLOBAL_UCASE,                     Global_UCase, 0, 1},
1787     {DISPID_GLOBAL_LTRIM,                     Global_LTrim, 0, 1},
1788     {DISPID_GLOBAL_RTRIM,                     Global_RTrim, 0, 1},
1789     {DISPID_GLOBAL_TRIM,                      Global_Trim, 0, 1},
1790     {DISPID_GLOBAL_SPACE,                     Global_Space, 0, 1},
1791     {DISPID_GLOBAL_STRING,                    Global_String, 0, 0, 2},
1792     {DISPID_GLOBAL_INSTR,                     Global_InStr, 0, 2, 4},
1793     {DISPID_GLOBAL_INSTRB,                    Global_InStrB, 0, 3, 4},
1794     {DISPID_GLOBAL_ASCB,                      Global_AscB, 0, 1},
1795     {DISPID_GLOBAL_CHRB,                      Global_ChrB, 0, 1},
1796     {DISPID_GLOBAL_ASC,                       Global_Asc, 0, 1},
1797     {DISPID_GLOBAL_CHR,                       Global_Chr, 0, 1},
1798     {DISPID_GLOBAL_ASCW,                      Global_AscW, 0, 1},
1799     {DISPID_GLOBAL_CHRW,                      Global_ChrW, 0, 1},
1800     {DISPID_GLOBAL_ABS,                       Global_Abs, 0, 1},
1801     {DISPID_GLOBAL_FIX,                       Global_Fix, 0, 1},
1802     {DISPID_GLOBAL_INT,                       Global_Int, 0, 1},
1803     {DISPID_GLOBAL_SGN,                       Global_Sgn, 0, 1},
1804     {DISPID_GLOBAL_NOW,                       Global_Now, 0, 0},
1805     {DISPID_GLOBAL_DATE,                      Global_Date, 0, 0},
1806     {DISPID_GLOBAL_TIME,                      Global_Time, 0, 0},
1807     {DISPID_GLOBAL_DAY,                       Global_Day, 0, 1},
1808     {DISPID_GLOBAL_MONTH,                     Global_Month, 0, 1},
1809     {DISPID_GLOBAL_WEEKDAY,                   Global_Weekday, 0, 1, 2},
1810     {DISPID_GLOBAL_YEAR,                      Global_Year, 0, 1},
1811     {DISPID_GLOBAL_HOUR,                      Global_Hour, 0, 1},
1812     {DISPID_GLOBAL_MINUTE,                    Global_Minute, 0, 1},
1813     {DISPID_GLOBAL_SECOND,                    Global_Second, 0, 1},
1814     {DISPID_GLOBAL_DATEVALUE,                 Global_DateValue, 0, 1},
1815     {DISPID_GLOBAL_TIMEVALUE,                 Global_TimeValue, 0, 1},
1816     {DISPID_GLOBAL_DATESERIAL,                Global_DateSerial, 0, 3},
1817     {DISPID_GLOBAL_TIMESERIAL,                Global_TimeSerial, 0, 3},
1818     {DISPID_GLOBAL_INPUTBOX,                  Global_InputBox, 0, 1, 7},
1819     {DISPID_GLOBAL_MSGBOX,                    Global_MsgBox, 0, 1, 5},
1820     {DISPID_GLOBAL_CREATEOBJECT,              Global_CreateObject, 0, 1},
1821     {DISPID_GLOBAL_GETOBJECT,                 Global_GetObject, 0, 0, 2},
1822     {DISPID_GLOBAL_DATEADD,                   Global_DateAdd, 0, 3},
1823     {DISPID_GLOBAL_DATEDIFF,                  Global_DateDiff, 0, 3, 5},
1824     {DISPID_GLOBAL_DATEPART,                  Global_DatePart, 0, 2, 4},
1825     {DISPID_GLOBAL_TYPENAME,                  Global_TypeName, 0, 1},
1826     {DISPID_GLOBAL_ARRAY,                     Global_Array, 0, 1},
1827     {DISPID_GLOBAL_ERASE,                     Global_Erase, 0, 1},
1828     {DISPID_GLOBAL_FILTER,                    Global_Filter, 0, 2, 4},
1829     {DISPID_GLOBAL_JOIN,                      Global_Join, 0, 1, 2},
1830     {DISPID_GLOBAL_SPLIT,                     Global_Split, 0, 1, 4},
1831     {DISPID_GLOBAL_REPLACE,                   Global_Replace, 0, 3, 6},
1832     {DISPID_GLOBAL_STRREVERSE,                Global_StrReverse, 0, 1},
1833     {DISPID_GLOBAL_INSTRREV,                  Global_InStrRev, 0, 2, 4},
1834     {DISPID_GLOBAL_LOADPICTURE,               Global_LoadPicture, 0, 1},
1835     {DISPID_GLOBAL_SCRIPTENGINE,              Global_ScriptEngine, 0, 0},
1836     {DISPID_GLOBAL_SCRIPTENGINEMAJORVERSION,  Global_ScriptEngineMajorVersion, 0, 0},
1837     {DISPID_GLOBAL_SCRIPTENGINEMINORVERSION,  Global_ScriptEngineMinorVersion, 0, 0},
1838     {DISPID_GLOBAL_SCRIPTENGINEBUILDVERSION,  Global_ScriptEngineBuildVersion, 0, 0},
1839     {DISPID_GLOBAL_FORMATNUMBER,              Global_FormatNumber, 0, 1, 5},
1840     {DISPID_GLOBAL_FORMATCURRENCY,            Global_FormatCurrency, 0, 1, 5},
1841     {DISPID_GLOBAL_FORMATPERCENT,             Global_FormatPercent, 0, 1, 5},
1842     {DISPID_GLOBAL_FORMATDATETIME,            Global_FormatDateTime, 0, 1, 2},
1843     {DISPID_GLOBAL_WEEKDAYNAME,               Global_WeekdayName, 0, 3},
1844     {DISPID_GLOBAL_MONTHNAME,                 Global_MonthName, 0, 1, 2},
1845     {DISPID_GLOBAL_ROUND,                     Global_Round, 0, 1, 2},
1846     {DISPID_GLOBAL_ESCAPE,                    Global_Escape, 0, 1},
1847     {DISPID_GLOBAL_UNESCAPE,                  Global_Unescape, 0, 1},
1848     {DISPID_GLOBAL_EVAL,                      Global_Eval, 0, 1},
1849     {DISPID_GLOBAL_EXECUTE,                   Global_Execute, 0, 1},
1850     {DISPID_GLOBAL_EXECUTEGLOBAL,             Global_ExecuteGlobal, 0, 1},
1851     {DISPID_GLOBAL_GETREF,                    Global_GetRef, 0, 1},
1852     {DISPID_GLOBAL_VBMSGBOXHELPBUTTON,     Global_vbMsgBoxHelpButton, BP_GET},
1853     {DISPID_GLOBAL_VBMSGBOXSETFOREGROUND,  Global_vbMsgBoxSetForeground, BP_GET},
1854     {DISPID_GLOBAL_VBMSGBOXRIGHT,          Global_vbMsgBoxRight, BP_GET},
1855     {DISPID_GLOBAL_VBMSGBOXRTLREADING,     Global_vbMsgBoxRtlReading, BP_GET}
1856 };
1857
1858 HRESULT init_global(script_ctx_t *ctx)
1859 {
1860     HRESULT hres;
1861
1862     ctx->global_desc.ctx = ctx;
1863     ctx->global_desc.builtin_prop_cnt = sizeof(global_props)/sizeof(*global_props);
1864     ctx->global_desc.builtin_props = global_props;
1865
1866     hres = get_typeinfo(GlobalObj_tid, &ctx->global_desc.typeinfo);
1867     if(FAILED(hres))
1868         return hres;
1869
1870     hres = create_vbdisp(&ctx->global_desc, &ctx->global_obj);
1871     if(FAILED(hres))
1872         return hres;
1873
1874     hres = create_script_disp(ctx, &ctx->script_obj);
1875     if(FAILED(hres))
1876         return hres;
1877
1878     return init_err(ctx);
1879 }