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