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