2 * Copyright 2011 Jacek Caban for CodeWeavers
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.
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.
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
28 #include "wine/test.h"
32 #define IActiveScriptParse_QueryInterface IActiveScriptParse64_QueryInterface
33 #define IActiveScriptParse_Release IActiveScriptParse64_Release
34 #define IActiveScriptParse_InitNew IActiveScriptParse64_InitNew
35 #define IActiveScriptParse_ParseScriptText IActiveScriptParse64_ParseScriptText
36 #define IActiveScriptParseProcedure2_Release IActiveScriptParseProcedure2_64_Release
37 #define IActiveScriptParseProcedure2_ParseProcedureText IActiveScriptParseProcedure2_64_ParseProcedureText
41 #define IActiveScriptParse_QueryInterface IActiveScriptParse32_QueryInterface
42 #define IActiveScriptParse_Release IActiveScriptParse32_Release
43 #define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew
44 #define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText
45 #define IActiveScriptParseProcedure2_Release IActiveScriptParseProcedure2_32_Release
46 #define IActiveScriptParseProcedure2_ParseProcedureText IActiveScriptParseProcedure2_32_ParseProcedureText
50 extern const CLSID CLSID_VBScript;
52 #define DEFINE_EXPECT(func) \
53 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
55 #define SET_EXPECT(func) \
56 expect_ ## func = TRUE
58 #define CHECK_EXPECT2(func) \
60 ok(expect_ ##func, "unexpected call " #func "\n"); \
61 called_ ## func = TRUE; \
64 #define CHECK_EXPECT(func) \
66 CHECK_EXPECT2(func); \
67 expect_ ## func = FALSE; \
70 #define CHECK_CALLED(func) \
72 ok(called_ ## func, "expected " #func "\n"); \
73 expect_ ## func = called_ ## func = FALSE; \
76 DEFINE_EXPECT(global_success_d);
77 DEFINE_EXPECT(global_success_i);
78 DEFINE_EXPECT(global_vbvar_d);
79 DEFINE_EXPECT(global_vbvar_i);
80 DEFINE_EXPECT(testobj_propget_d);
81 DEFINE_EXPECT(testobj_propget_i);
82 DEFINE_EXPECT(testobj_propput_d);
83 DEFINE_EXPECT(testobj_propput_i);
84 DEFINE_EXPECT(global_propargput_d);
85 DEFINE_EXPECT(global_propargput_i);
86 DEFINE_EXPECT(global_propargput1_d);
87 DEFINE_EXPECT(global_propargput1_i);
88 DEFINE_EXPECT(collectionobj_newenum_i);
91 #define DISPID_GLOBAL_REPORTSUCCESS 1000
92 #define DISPID_GLOBAL_TRACE 1001
93 #define DISPID_GLOBAL_OK 1002
94 #define DISPID_GLOBAL_GETVT 1003
95 #define DISPID_GLOBAL_ISENGLANG 1004
96 #define DISPID_GLOBAL_VBVAR 1005
97 #define DISPID_GLOBAL_TESTOBJ 1006
98 #define DISPID_GLOBAL_ISNULLDISP 1007
99 #define DISPID_GLOBAL_TESTDISP 1008
100 #define DISPID_GLOBAL_REFOBJ 1009
101 #define DISPID_GLOBAL_COUNTER 1010
102 #define DISPID_GLOBAL_PROPARGPUT 1011
103 #define DISPID_GLOBAL_PROPARGPUT1 1012
104 #define DISPID_GLOBAL_COLLOBJ 1013
105 #define DISPID_GLOBAL_DOUBLEASSTRING 1014
107 #define DISPID_TESTOBJ_PROPGET 2000
108 #define DISPID_TESTOBJ_PROPPUT 2001
110 #define DISPID_COLLOBJ_RESET 3000
112 static const WCHAR testW[] = {'t','e','s','t',0};
113 static const WCHAR emptyW[] = {0};
115 static BOOL strict_dispid_check, is_english;
116 static const char *test_name = "(null)";
117 static int test_counter;
119 static BSTR a2bstr(const char *str)
124 len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
125 ret = SysAllocStringLen(NULL, len-1);
126 MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
131 static int strcmp_wa(LPCWSTR strw, const char *stra)
134 WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0);
135 return lstrcmpA(buf, stra);
138 static const char *debugstr_guid(REFIID riid)
142 sprintf(buf, "{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}",
143 riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
144 riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
145 riid->Data4[5], riid->Data4[6], riid->Data4[7]);
150 static const char *vt2a(VARIANT *v)
152 if(V_VT(v) == (VT_BYREF|VT_VARIANT)) {
154 sprintf(buf, "%s*", vt2a(V_BYREF(v)));
172 return "VT_DISPATCH";
175 case VT_ARRAY|VT_VARIANT:
176 return "VT_ARRAY|VT_VARIANT";
178 ok(0, "unknown vt %d\n", V_VT(v));
183 /* Returns true if the user interface is in English. Note that this does not
184 * presume of the formatting of dates, numbers, etc.
186 static BOOL is_lang_english(void)
188 static HMODULE hkernel32 = NULL;
189 static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL;
190 static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL;
194 hkernel32 = GetModuleHandleA("kernel32.dll");
195 pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage");
196 pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage");
198 if (pGetThreadUILanguage)
199 return PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH;
200 if (pGetUserDefaultUILanguage)
201 return PRIMARYLANGID(pGetUserDefaultUILanguage()) == LANG_ENGLISH;
203 return PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
206 static HRESULT WINAPI ServiceProvider_QueryInterface(IServiceProvider *iface, REFIID riid, void **ppv)
208 ok(0, "unexpected call\n");
209 return E_NOINTERFACE;
212 static ULONG WINAPI ServiceProvider_AddRef(IServiceProvider *iface)
217 static ULONG WINAPI ServiceProvider_Release(IServiceProvider *iface)
222 static HRESULT WINAPI ServiceProvider_QueryService(IServiceProvider *iface, REFGUID guidService,
223 REFIID riid, void **ppv)
225 ok(0, "unexpected service %s\n", debugstr_guid(guidService));
226 return E_NOINTERFACE;
229 static const IServiceProviderVtbl ServiceProviderVtbl = {
230 ServiceProvider_QueryInterface,
231 ServiceProvider_AddRef,
232 ServiceProvider_Release,
233 ServiceProvider_QueryService
236 static IServiceProvider caller_sp = { &ServiceProviderVtbl };
238 static void test_disp(IDispatch *disp)
240 DISPID id, public_prop_id, public_prop2_id, public_func_id, public_sub_id, defvalget_id;
241 DISPID named_args[5] = {DISPID_PROPERTYPUT};
243 DISPPARAMS dp = {args, named_args};
249 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
250 ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
252 str = a2bstr("publicProp");
253 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop_id);
255 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
257 str = a2bstr("PUBLICPROP");
258 hres = IDispatchEx_GetDispID(dispex, str, 0, &id);
260 ok(hres == S_OK, "GetDispID(PUBLICPROP) failed: %08x\n", hres);
261 ok(public_prop_id == id, "id = %d\n", public_prop_id);
263 str = a2bstr("publicPROP2");
264 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop2_id);
266 ok(hres == S_OK, "GetDispID(publicProp2) failed: %08x\n", hres);
268 str = a2bstr("defValGet");
269 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &defvalget_id);
271 ok(hres == S_OK, "GetDispID(defValGet) failed: %08x\n", hres);
272 ok(defvalget_id == DISPID_VALUE, "id = %d\n", defvalget_id);
274 str = a2bstr("privateProp");
275 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
277 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
278 ok(id == -1, "id = %d\n", id);
280 str = a2bstr("class_initialize");
281 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
283 ok(hres == S_OK, "GetDispID(publicProp2) failed: %08x\n", hres);
285 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
286 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
287 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
289 V_VT(args) = VT_BOOL;
290 V_BOOL(args) = VARIANT_TRUE;
291 dp.cArgs = dp.cNamedArgs = 1;
293 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, &v, &ei, NULL);
294 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
295 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
297 dp.cArgs = dp.cNamedArgs = 0;
298 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
299 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
300 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
301 ok(V_BOOL(&v), "V_BOOL(v) = %x\n", V_BOOL(&v));
303 dp.cArgs = dp.cNamedArgs = 0;
304 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
305 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
306 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
307 ok(V_BOOL(&v), "V_BOOL(v) = %x\n", V_BOOL(&v));
310 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
311 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
312 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
314 V_VT(args) = VT_BOOL;
315 V_BOOL(args) = VARIANT_FALSE;
318 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
319 ok(hres == DISP_E_PARAMNOTOPTIONAL, "InvokeEx failed: %08x, expected DISP_E_PARAMNOTOPTIONAL\n", hres);
321 str = a2bstr("publicFunction");
322 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_func_id);
324 ok(hres == S_OK, "GetDispID(publicFunction) failed: %08x\n", hres);
325 ok(public_func_id != -1, "public_func_id = -1\n");
327 str = a2bstr("publicSub");
328 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_sub_id);
330 ok(hres == S_OK, "GetDispID(publicSub) failed: %08x\n", hres);
331 ok(public_sub_id != -1, "public_func_id = -1\n");
333 dp.cArgs = dp.cNamedArgs = 0;
334 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
335 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
336 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
337 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
339 dp.cArgs = dp.cNamedArgs = 0;
340 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
341 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
342 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
344 dp.cArgs = dp.cNamedArgs = 0;
345 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
346 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
347 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
348 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
350 dp.cArgs = dp.cNamedArgs = 0;
351 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
352 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
353 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
355 dp.cArgs = dp.cNamedArgs = 0;
356 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
357 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
358 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
360 dp.cArgs = dp.cNamedArgs = 0;
361 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
362 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
363 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
365 V_VT(args) = VT_BOOL;
366 V_BOOL(args) = VARIANT_TRUE;
367 dp.cArgs = dp.cNamedArgs = 1;
368 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
369 ok(FAILED(hres), "InvokeEx succeeded: %08x\n", hres);
371 dp.cArgs = dp.cNamedArgs = 0;
372 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
373 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
374 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
375 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
377 dp.cArgs = dp.cNamedArgs = 0;
378 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
379 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
380 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
381 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
383 dp.cArgs = dp.cNamedArgs = 0;
384 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
385 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
386 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
388 dp.cArgs = dp.cNamedArgs = 0;
389 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
390 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
391 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
393 str = a2bstr("privateSub");
394 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
396 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateSub) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
397 ok(id == -1, "id = %d\n", id);
399 str = a2bstr("dynprop");
400 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive|fdexNameEnsure, &id);
401 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
402 ok(id == -1, "id = %d\n", id);
403 hres = IDispatchEx_GetDispID(dispex, str, fdexNameEnsure, &id);
404 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
405 ok(id == -1, "id = %d\n", id);
408 str = a2bstr("publicProp");
409 hres = IDispatchEx_GetDispID(dispex, str, 0x80000000|fdexNameCaseInsensitive, &public_prop_id);
411 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
414 str = a2bstr("publicProp");
415 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
417 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
418 ok(id == public_prop_id, "id = %d, expected %d\n", id, public_prop_id);
421 str = a2bstr("publicprop");
422 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
424 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
425 ok(id == public_prop_id, "id = %d, expected %d\n", id, public_prop_id);
427 IDispatchEx_Release(dispex);
430 #define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
431 static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
433 ok_(__FILE__,line)(grfdex == expect, "grfdex = %x, expected %x\n", grfdex, expect);
436 static IDispatchEx enumDisp;
438 static HRESULT WINAPI EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
440 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumVARIANT)) {
445 if(IsEqualGUID(riid, &IID_IDispatch)) {
450 ok(0, "unexpected call %s\n", debugstr_guid(riid));
451 return E_NOINTERFACE;
454 static ULONG WINAPI EnumVARIANT_AddRef(IEnumVARIANT *iface)
459 static ULONG WINAPI EnumVARIANT_Release(IEnumVARIANT *iface)
464 static unsigned next_cnt;
466 static HRESULT WINAPI EnumVARIANT_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
468 if(strict_dispid_check)
471 ok(celt == 1, "celt = %d\n", celt);
472 ok(V_VT(rgVar) == VT_EMPTY, "V_VT(rgVar) = %d\n", V_VT(rgVar));
473 ok(!pCeltFetched, "pCeltFetched = %p\n", pCeltFetched);
477 V_I2(rgVar) = next_cnt;
484 static HRESULT WINAPI EnumVARIANT_Skip(IEnumVARIANT *iface, ULONG celt)
486 ok(0, "unexpected call\n");
490 static HRESULT WINAPI EnumVARIANT_Reset(IEnumVARIANT *iface)
492 ok(0, "unexpected call\n");
496 static HRESULT WINAPI EnumVARIANT_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum)
498 ok(0, "unexpected call\n");
502 static const IEnumVARIANTVtbl EnumVARIANTVtbl = {
503 EnumVARIANT_QueryInterface,
512 static IEnumVARIANT enumObj = { &EnumVARIANTVtbl };
514 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
518 if(IsEqualGUID(riid, &IID_IUnknown)
519 || IsEqualGUID(riid, &IID_IDispatch)
520 || IsEqualGUID(riid, &IID_IDispatchEx))
523 trace("QI %s\n", debugstr_guid(riid));
524 return E_NOINTERFACE;
527 IUnknown_AddRef((IUnknown*)*ppv);
531 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
536 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
541 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
543 ok(0, "unexpected call\n");
547 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
548 LCID lcid, ITypeInfo **ppTInfo)
550 ok(0, "unexpected call\n");
554 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
555 LPOLESTR *rgszNames, UINT cNames,
556 LCID lcid, DISPID *rgDispId)
558 ok(0, "unexpected call\n");
562 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
563 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
564 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
566 ok(0, "unexpected call\n");
570 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
572 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
576 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
578 ok(0, "unexpected call\n");
582 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
584 ok(0, "unexpected call\n");
588 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
590 ok(0, "unexpected call\n");
594 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
596 ok(0, "unexpected call\n");
600 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
602 ok(0, "unexpected call\n");
606 static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
608 ok(0, "unexpected call\n");
612 static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
613 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
615 ok(0, "unexpected call %d\n", id);
619 static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
621 if(!strcmp_wa(bstrName, "propget")) {
622 CHECK_EXPECT(testobj_propget_d);
623 test_grfdex(grfdex, fdexNameCaseInsensitive);
624 *pid = DISPID_TESTOBJ_PROPGET;
627 if(!strcmp_wa(bstrName, "propput")) {
628 CHECK_EXPECT(testobj_propput_d);
629 test_grfdex(grfdex, fdexNameCaseInsensitive);
630 *pid = DISPID_TESTOBJ_PROPPUT;
634 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
635 return DISP_E_UNKNOWNNAME;
638 static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
639 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
642 case DISPID_TESTOBJ_PROPGET:
643 CHECK_EXPECT(testobj_propget_i);
645 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
646 ok(pdp != NULL, "pdp == NULL\n");
647 ok(!pdp->rgvarg, "rgvarg == NULL\n");
648 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
649 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
650 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
651 ok(pvarRes != NULL, "pvarRes == NULL\n");
652 ok(pei != NULL, "pei == NULL\n");
654 V_VT(pvarRes) = VT_I2;
657 case DISPID_TESTOBJ_PROPPUT:
658 CHECK_EXPECT(testobj_propput_i);
660 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
661 ok(pdp != NULL, "pdp == NULL\n");
662 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
663 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
664 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
665 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
666 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
667 ok(!pvarRes, "pvarRes != NULL\n");
668 ok(pei != NULL, "pei == NULL\n");
670 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
671 ok(V_I2(pdp->rgvarg) == 1, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
675 ok(0, "unexpected call %d\n", id);
679 static IDispatchExVtbl testObjVtbl = {
680 DispatchEx_QueryInterface,
683 DispatchEx_GetTypeInfoCount,
684 DispatchEx_GetTypeInfo,
685 DispatchEx_GetIDsOfNames,
689 DispatchEx_DeleteMemberByName,
690 DispatchEx_DeleteMemberByDispID,
691 DispatchEx_GetMemberProperties,
692 DispatchEx_GetMemberName,
693 DispatchEx_GetNextDispID,
694 DispatchEx_GetNameSpaceParent
697 static IDispatchEx testObj = { &testObjVtbl };
699 static HRESULT WINAPI enumDisp_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
701 return IEnumVARIANT_QueryInterface(&enumObj, riid, ppv);
704 static IDispatchExVtbl enumDispVtbl = {
705 enumDisp_QueryInterface,
708 DispatchEx_GetTypeInfoCount,
709 DispatchEx_GetTypeInfo,
710 DispatchEx_GetIDsOfNames,
712 DispatchEx_GetDispID,
714 DispatchEx_DeleteMemberByName,
715 DispatchEx_DeleteMemberByDispID,
716 DispatchEx_GetMemberProperties,
717 DispatchEx_GetMemberName,
718 DispatchEx_GetNextDispID,
719 DispatchEx_GetNameSpaceParent
722 static IDispatchEx enumDisp = { &enumDispVtbl };
724 static HRESULT WINAPI collectionObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
726 if(!strcmp_wa(bstrName, "reset")) {
727 *pid = DISPID_COLLOBJ_RESET;
731 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
732 return DISP_E_UNKNOWNNAME;
735 static HRESULT WINAPI collectionObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
736 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
740 if(strict_dispid_check)
741 CHECK_EXPECT(collectionobj_newenum_i);
743 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
744 ok(pdp != NULL, "pdp == NULL\n");
745 ok(!pdp->rgvarg, "rgvarg == NULL\n");
746 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
747 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
748 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
749 ok(pvarRes != NULL, "pvarRes == NULL\n");
750 ok(pei != NULL, "pei == NULL\n");
752 V_VT(pvarRes) = VT_UNKNOWN;
753 V_UNKNOWN(pvarRes) = (IUnknown*)&enumObj;
755 case DISPID_COLLOBJ_RESET:
760 ok(0, "unexpected call %d\n", id);
764 static IDispatchExVtbl collectionObjVtbl = {
765 DispatchEx_QueryInterface,
768 DispatchEx_GetTypeInfoCount,
769 DispatchEx_GetTypeInfo,
770 DispatchEx_GetIDsOfNames,
772 collectionObj_GetDispID,
773 collectionObj_InvokeEx,
774 DispatchEx_DeleteMemberByName,
775 DispatchEx_DeleteMemberByDispID,
776 DispatchEx_GetMemberProperties,
777 DispatchEx_GetMemberName,
778 DispatchEx_GetNextDispID,
779 DispatchEx_GetNameSpaceParent
782 static IDispatchEx collectionObj = { &collectionObjVtbl };
784 static ULONG refobj_ref;
786 static ULONG WINAPI RefObj_AddRef(IDispatchEx *iface)
791 static ULONG WINAPI RefObj_Release(IDispatchEx *iface)
796 static IDispatchExVtbl RefObjVtbl = {
797 DispatchEx_QueryInterface,
800 DispatchEx_GetTypeInfoCount,
801 DispatchEx_GetTypeInfo,
802 DispatchEx_GetIDsOfNames,
804 DispatchEx_GetDispID,
806 DispatchEx_DeleteMemberByName,
807 DispatchEx_DeleteMemberByDispID,
808 DispatchEx_GetMemberProperties,
809 DispatchEx_GetMemberName,
810 DispatchEx_GetNextDispID,
811 DispatchEx_GetNameSpaceParent
814 static IDispatchEx RefObj = { &RefObjVtbl };
816 static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
818 if(!strcmp_wa(bstrName, "ok")) {
819 test_grfdex(grfdex, fdexNameCaseInsensitive);
820 *pid = DISPID_GLOBAL_OK;
823 if(!strcmp_wa(bstrName, "trace")) {
824 test_grfdex(grfdex, fdexNameCaseInsensitive);
825 *pid = DISPID_GLOBAL_TRACE;
828 if(!strcmp_wa(bstrName, "reportSuccess")) {
829 CHECK_EXPECT(global_success_d);
830 test_grfdex(grfdex, fdexNameCaseInsensitive);
831 *pid = DISPID_GLOBAL_REPORTSUCCESS;
834 if(!strcmp_wa(bstrName, "getVT")) {
835 test_grfdex(grfdex, fdexNameCaseInsensitive);
836 *pid = DISPID_GLOBAL_GETVT;
839 if(!strcmp_wa(bstrName, "isEnglishLang")) {
840 test_grfdex(grfdex, fdexNameCaseInsensitive);
841 *pid = DISPID_GLOBAL_ISENGLANG;
844 if(!strcmp_wa(bstrName, "testObj")) {
845 test_grfdex(grfdex, fdexNameCaseInsensitive);
846 *pid = DISPID_GLOBAL_TESTOBJ;
849 if(!strcmp_wa(bstrName, "collectionObj")) {
850 test_grfdex(grfdex, fdexNameCaseInsensitive);
851 *pid = DISPID_GLOBAL_COLLOBJ;
854 if(!strcmp_wa(bstrName, "vbvar")) {
855 CHECK_EXPECT(global_vbvar_d);
856 test_grfdex(grfdex, fdexNameCaseInsensitive);
857 *pid = DISPID_GLOBAL_VBVAR;
860 if(!strcmp_wa(bstrName, "isNullDisp")) {
861 test_grfdex(grfdex, fdexNameCaseInsensitive);
862 *pid = DISPID_GLOBAL_ISNULLDISP;
865 if(!strcmp_wa(bstrName, "testDisp")) {
866 test_grfdex(grfdex, fdexNameCaseInsensitive);
867 *pid = DISPID_GLOBAL_TESTDISP;
870 if(!strcmp_wa(bstrName, "RefObj")) {
871 test_grfdex(grfdex, fdexNameCaseInsensitive);
872 *pid = DISPID_GLOBAL_REFOBJ;
875 if(!strcmp_wa(bstrName, "propargput")) {
876 CHECK_EXPECT(global_propargput_d);
877 test_grfdex(grfdex, fdexNameCaseInsensitive);
878 *pid = DISPID_GLOBAL_PROPARGPUT;
881 if(!strcmp_wa(bstrName, "propargput1")) {
882 CHECK_EXPECT(global_propargput1_d);
883 test_grfdex(grfdex, fdexNameCaseInsensitive);
884 *pid = DISPID_GLOBAL_PROPARGPUT1;
887 if(!strcmp_wa(bstrName, "counter")) {
888 test_grfdex(grfdex, fdexNameCaseInsensitive);
889 *pid = DISPID_GLOBAL_COUNTER;
892 if(!strcmp_wa(bstrName, "doubleAsString")) {
893 test_grfdex(grfdex, fdexNameCaseInsensitive);
894 *pid = DISPID_GLOBAL_DOUBLEASSTRING;
898 if(strict_dispid_check && strcmp_wa(bstrName, "x"))
899 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
900 return DISP_E_UNKNOWNNAME;
903 static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
904 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
907 case DISPID_GLOBAL_OK: {
910 ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
911 ok(pdp != NULL, "pdp == NULL\n");
912 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
913 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
914 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
915 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
916 if(wFlags & INVOKE_PROPERTYGET)
917 ok(pvarRes != NULL, "pvarRes == NULL\n");
919 ok(!pvarRes, "pvarRes != NULL\n");
920 ok(pei != NULL, "pei == NULL\n");
922 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
925 if(V_VT(b) == (VT_BYREF|VT_VARIANT))
928 ok(V_VT(b) == VT_BOOL, "V_VT(b) = %d\n", V_VT(b));
930 ok(V_BOOL(b), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
934 case DISPID_GLOBAL_TRACE:
935 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
936 ok(pdp != NULL, "pdp == NULL\n");
937 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
938 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
939 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
940 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
941 ok(!pvarRes, "pvarRes != NULL\n");
942 ok(pei != NULL, "pei == NULL\n");
944 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
945 if(V_VT(pdp->rgvarg) == VT_BSTR)
946 trace("%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
950 case DISPID_GLOBAL_REPORTSUCCESS:
951 CHECK_EXPECT(global_success_i);
953 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
954 ok(pdp != NULL, "pdp == NULL\n");
955 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
956 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
957 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
958 ok(!pvarRes, "pvarRes != NULL\n");
959 ok(pei != NULL, "pei == NULL\n");
963 case DISPID_GLOBAL_GETVT:
964 ok(pdp != NULL, "pdp == NULL\n");
965 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
966 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
967 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
968 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
969 ok(pvarRes != NULL, "pvarRes == NULL\n");
970 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
971 ok(pei != NULL, "pei == NULL\n");
973 V_VT(pvarRes) = VT_BSTR;
974 V_BSTR(pvarRes) = a2bstr(vt2a(pdp->rgvarg));
977 case DISPID_GLOBAL_ISENGLANG:
978 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
979 ok(pdp != NULL, "pdp == NULL\n");
980 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
981 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
982 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
983 ok(pvarRes != NULL, "pvarRes == NULL\n");
984 ok(pei != NULL, "pei == NULL\n");
986 V_VT(pvarRes) = VT_BOOL;
987 V_BOOL(pvarRes) = is_english ? VARIANT_TRUE : VARIANT_FALSE;
990 case DISPID_GLOBAL_VBVAR:
991 CHECK_EXPECT(global_vbvar_i);
993 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
994 ok(pdp != NULL, "pdp == NULL\n");
995 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
996 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
997 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
998 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
999 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1000 ok(!pvarRes, "pvarRes != NULL\n");
1001 ok(pei != NULL, "pei == NULL\n");
1003 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1004 ok(V_I2(pdp->rgvarg) == 3, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1007 case DISPID_GLOBAL_TESTOBJ:
1008 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1010 ok(pdp != NULL, "pdp == NULL\n");
1011 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1012 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1013 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1014 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1015 ok(pvarRes != NULL, "pvarRes == NULL\n");
1016 ok(pei != NULL, "pei == NULL\n");
1018 V_VT(pvarRes) = VT_DISPATCH;
1019 V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
1022 case DISPID_GLOBAL_COLLOBJ:
1023 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1025 ok(pdp != NULL, "pdp == NULL\n");
1026 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1027 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1028 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1029 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1030 ok(pvarRes != NULL, "pvarRes == NULL\n");
1031 ok(pei != NULL, "pei == NULL\n");
1033 V_VT(pvarRes) = VT_DISPATCH;
1034 V_DISPATCH(pvarRes) = (IDispatch*)&collectionObj;
1037 case DISPID_GLOBAL_REFOBJ:
1038 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1040 ok(pdp != NULL, "pdp == NULL\n");
1041 ok(!pdp->rgvarg, "rgvarg == NULL\n");
1042 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1043 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1044 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1045 ok(pvarRes != NULL, "pvarRes == NULL\n");
1046 ok(pei != NULL, "pei == NULL\n");
1048 IDispatchEx_AddRef(&RefObj);
1049 V_VT(pvarRes) = VT_DISPATCH;
1050 V_DISPATCH(pvarRes) = (IDispatch*)&RefObj;
1053 case DISPID_GLOBAL_ISNULLDISP: {
1056 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1057 ok(pdp != NULL, "pdp == NULL\n");
1058 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1059 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1060 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1061 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1062 ok(pvarRes != NULL, "pvarRes == NULL\n");
1063 ok(pei != NULL, "pei == NULL\n");
1066 if(V_VT(v) == (VT_VARIANT|VT_BYREF))
1067 v = V_VARIANTREF(v);
1069 ok(V_VT(v) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1070 V_VT(pvarRes) = VT_BOOL;
1071 V_BOOL(pvarRes) = V_DISPATCH(v) ? VARIANT_FALSE : VARIANT_TRUE;
1075 case DISPID_GLOBAL_TESTDISP:
1076 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1077 ok(pdp != NULL, "pdp == NULL\n");
1078 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1079 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1080 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1081 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1082 ok(!pvarRes, "pvarRes != NULL\n");
1083 ok(pei != NULL, "pei == NULL\n");
1085 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1086 test_disp(V_DISPATCH(pdp->rgvarg));
1089 case DISPID_GLOBAL_PROPARGPUT:
1090 CHECK_EXPECT(global_propargput_i);
1092 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1093 ok(pdp != NULL, "pdp == NULL\n");
1094 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1095 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1096 ok(pdp->cArgs == 3, "cArgs = %d\n", pdp->cArgs);
1097 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1098 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1099 ok(!pvarRes, "pvarRes != NULL\n");
1100 ok(pei != NULL, "pei == NULL\n");
1102 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1103 ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1105 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1106 ok(V_I2(pdp->rgvarg+1) == 2, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1108 ok(V_VT(pdp->rgvarg+2) == VT_I2, "V_VT(psp->rgvargs+2) = %d\n", V_VT(pdp->rgvarg+2));
1109 ok(V_I2(pdp->rgvarg+2) == 1, "V_I2(psp->rgvargs+2) = %d\n", V_I2(pdp->rgvarg+2));
1112 case DISPID_GLOBAL_PROPARGPUT1:
1113 CHECK_EXPECT(global_propargput1_i);
1115 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1116 ok(pdp != NULL, "pdp == NULL\n");
1117 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1118 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1119 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1120 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1121 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1122 ok(!pvarRes, "pvarRes != NULL\n");
1123 ok(pei != NULL, "pei == NULL\n");
1125 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1126 ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1128 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1129 ok(V_I2(pdp->rgvarg+1) == 1, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1133 case DISPID_GLOBAL_COUNTER:
1134 ok(pdp != NULL, "pdp == NULL\n");
1135 todo_wine ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1136 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1137 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1138 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1139 ok(pvarRes != NULL, "pvarRes == NULL\n");
1140 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1141 ok(pei != NULL, "pei == NULL\n");
1143 V_VT(pvarRes) = VT_I2;
1144 V_I2(pvarRes) = test_counter++;
1147 case DISPID_GLOBAL_DOUBLEASSTRING:
1148 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1149 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1150 ok(V_VT(pdp->rgvarg) == VT_R8, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1151 ok(pvarRes != NULL, "pvarRes == NULL\n");
1153 V_VT(pvarRes) = VT_BSTR;
1154 return VarBstrFromR8(V_R8(pdp->rgvarg), 0, 0, &V_BSTR(pvarRes));
1157 ok(0, "unexpected call %d\n", id);
1158 return DISP_E_MEMBERNOTFOUND;
1161 static IDispatchExVtbl GlobalVtbl = {
1162 DispatchEx_QueryInterface,
1165 DispatchEx_GetTypeInfoCount,
1166 DispatchEx_GetTypeInfo,
1167 DispatchEx_GetIDsOfNames,
1171 DispatchEx_DeleteMemberByName,
1172 DispatchEx_DeleteMemberByDispID,
1173 DispatchEx_GetMemberProperties,
1174 DispatchEx_GetMemberName,
1175 DispatchEx_GetNextDispID,
1176 DispatchEx_GetNameSpaceParent
1179 static IDispatchEx Global = { &GlobalVtbl };
1181 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
1185 if(IsEqualGUID(&IID_IUnknown, riid))
1187 else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
1190 return E_NOINTERFACE;
1192 IUnknown_AddRef((IUnknown*)*ppv);
1196 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
1201 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
1206 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
1208 *plcid = GetUserDefaultLCID();
1212 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
1213 DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
1215 ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
1216 ok(!ppti, "ppti != NULL\n");
1218 if(strcmp_wa(pstrName, "test"))
1219 ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName));
1221 *ppiunkItem = (IUnknown*)&Global;
1225 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
1230 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
1231 const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
1236 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
1241 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
1246 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
1251 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
1256 #undef ACTSCPSITE_THIS
1258 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
1259 ActiveScriptSite_QueryInterface,
1260 ActiveScriptSite_AddRef,
1261 ActiveScriptSite_Release,
1262 ActiveScriptSite_GetLCID,
1263 ActiveScriptSite_GetItemInfo,
1264 ActiveScriptSite_GetDocVersionString,
1265 ActiveScriptSite_OnScriptTerminate,
1266 ActiveScriptSite_OnStateChange,
1267 ActiveScriptSite_OnScriptError,
1268 ActiveScriptSite_OnEnterScript,
1269 ActiveScriptSite_OnLeaveScript
1272 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
1274 static IActiveScript *create_script(void)
1276 IActiveScript *script;
1279 hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1280 &IID_IActiveScript, (void**)&script);
1281 ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
1286 static IActiveScript *create_and_init_script(DWORD flags)
1288 IActiveScriptParse *parser;
1289 IActiveScript *engine;
1292 engine = create_script();
1296 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1297 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1299 hres = IActiveScriptParse_InitNew(parser);
1300 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1302 IActiveScriptParse_Release(parser);
1304 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1305 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1307 hres = IActiveScript_AddNamedItem(engine, testW,
1308 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
1309 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1311 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1312 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1317 static void close_script(IActiveScript *script)
1322 hres = IActiveScript_Close(script);
1323 ok(hres == S_OK, "Close failed: %08x\n", hres);
1325 ref = IActiveScript_Release(script);
1326 ok(!ref, "ref=%u\n", ref);
1329 static HRESULT parse_script(DWORD flags, BSTR script_str)
1331 IActiveScriptParse *parser;
1332 IActiveScript *engine;
1333 IDispatch *script_disp;
1337 engine = create_and_init_script(flags);
1341 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1342 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1345 IActiveScript_Release(engine);
1349 hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
1350 ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
1351 ok(script_disp != NULL, "script_disp == NULL\n");
1352 ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
1356 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1358 IActiveScript_Close(engine);
1360 IDispatch_Release(script_disp);
1361 IActiveScript_Release(engine);
1363 ref = IActiveScriptParse_Release(parser);
1364 ok(!ref, "ref=%d\n", ref);
1368 static void parse_script_af(DWORD flags, const char *src)
1374 hres = parse_script(flags, tmp);
1376 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1379 static void parse_script_a(const char *src)
1381 parse_script_af(SCRIPTITEM_GLOBALMEMBERS, src);
1384 static IDispatchEx *parse_procedure(IActiveScriptParseProcedure2 *parse_proc, const char *src)
1386 IDispatchEx *dispex;
1391 static const WCHAR delimiterW[] = {'\"',0};
1394 hres = IActiveScriptParseProcedure2_ParseProcedureText(parse_proc, str, NULL, emptyW, NULL, NULL, delimiterW, 0, 0,
1395 SCRIPTPROC_HOSTMANAGESSOURCE|SCRIPTPROC_IMPLICIT_THIS|SCRIPTPROC_IMPLICIT_PARENTS, &disp);
1397 ok(hres == S_OK, "ParseProcedureText failed: %08x\n", hres);
1398 ok(disp != NULL, "disp = NULL\n");
1400 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
1401 IDispatch_Release(disp);
1402 ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
1408 static void test_procedures(void)
1410 IActiveScriptParseProcedure2 *parse_proc;
1411 DISPPARAMS dp = {NULL};
1412 IActiveScript *script;
1418 script = create_and_init_script(0);
1420 hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParseProcedure2, (void**)&parse_proc);
1421 ok(hres == S_OK, "Could not get IActiveScriptParseProcedure2 iface: %08x\n", hres);
1423 proc = parse_procedure(parse_proc, "dim x\nif true then x=false");
1425 V_VT(&v) = VT_EMPTY;
1426 hres = IDispatchEx_InvokeEx(proc, DISPID_VALUE, 0, DISPATCH_METHOD, &dp, &v, &ei, &caller_sp);
1427 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
1429 IDispatchEx_Release(proc);
1431 IActiveScriptParseProcedure2_Release(parse_proc);
1433 close_script(script);
1436 static void test_gc(void)
1438 IActiveScriptParse *parser;
1439 IActiveScript *engine;
1443 strict_dispid_check = FALSE;
1445 engine = create_script();
1449 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1450 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1452 hres = IActiveScriptParse_InitNew(parser);
1453 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1455 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1456 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1458 hres = IActiveScript_AddNamedItem(engine, testW,
1459 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1460 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1462 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1463 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1468 " Public Sub Class_Terminate\n"
1469 " Call reportSuccess()\n"
1475 "set x = nothing\n");
1477 hres = IActiveScriptParse_ParseScriptText(parser, src, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1478 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1481 SET_EXPECT(global_success_d);
1482 SET_EXPECT(global_success_i);
1483 IActiveScript_Close(engine);
1484 CHECK_CALLED(global_success_d);
1485 CHECK_CALLED(global_success_i);
1487 IActiveScript_Release(engine);
1488 IActiveScriptParse_Release(parser);
1491 static HRESULT test_global_vars_ref(BOOL use_close)
1493 IActiveScriptParse *parser;
1494 IActiveScript *engine;
1499 engine = create_script();
1503 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1504 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1507 IActiveScript_Release(engine);
1511 hres = IActiveScriptParse_InitNew(parser);
1512 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1514 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1515 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1517 hres = IActiveScript_AddNamedItem(engine, testW, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1518 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1520 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1521 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1525 script_str = a2bstr("Dim x\nset x = RefObj\n");
1526 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1527 SysFreeString(script_str);
1529 ok(refobj_ref, "refobj_ref = 0\n");
1532 hres = IActiveScript_Close(engine);
1533 ok(hres == S_OK, "Close failed: %08x\n", hres);
1535 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_UNINITIALIZED);
1536 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1539 ok(!refobj_ref, "refobj_ref = %d\n", refobj_ref);
1541 IActiveScript_Release(engine);
1543 ref = IActiveScriptParse_Release(parser);
1544 ok(!ref, "ref=%d\n", ref);
1548 static BSTR get_script_from_file(const char *filename)
1552 const char *file_map;
1555 file = CreateFileA(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
1556 if(file == INVALID_HANDLE_VALUE) {
1557 trace("Could not open file: %u\n", GetLastError());
1561 size = GetFileSize(file, NULL);
1563 map = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL);
1565 if(map == INVALID_HANDLE_VALUE) {
1566 trace("Could not create file mapping: %u\n", GetLastError());
1570 file_map = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
1573 trace("MapViewOfFile failed: %u\n", GetLastError());
1577 len = MultiByteToWideChar(CP_ACP, 0, file_map, size, NULL, 0);
1578 ret = SysAllocStringLen(NULL, len);
1579 MultiByteToWideChar(CP_ACP, 0, file_map, size, ret, len);
1581 UnmapViewOfFile(file_map);
1586 static void run_from_file(const char *filename)
1591 script_str = get_script_from_file(filename);
1595 strict_dispid_check = FALSE;
1596 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str);
1597 SysFreeString(script_str);
1598 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1601 static void run_from_res(const char *name)
1609 strict_dispid_check = FALSE;
1612 src = FindResourceA(NULL, name, (LPCSTR)40);
1613 ok(src != NULL, "Could not find resource %s\n", name);
1615 size = SizeofResource(NULL, src);
1616 data = LoadResource(NULL, src);
1618 len = MultiByteToWideChar(CP_ACP, 0, data, size, NULL, 0);
1619 str = SysAllocStringLen(NULL, len);
1620 MultiByteToWideChar(CP_ACP, 0, data, size, str, len);
1622 SET_EXPECT(global_success_d);
1623 SET_EXPECT(global_success_i);
1624 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str);
1625 CHECK_CALLED(global_success_d);
1626 CHECK_CALLED(global_success_i);
1628 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1632 static void run_tests(void)
1634 strict_dispid_check = TRUE;
1637 parse_script_a("' empty ;");
1639 SET_EXPECT(global_success_d);
1640 SET_EXPECT(global_success_i);
1641 parse_script_a("reportSuccess");
1642 CHECK_CALLED(global_success_d);
1643 CHECK_CALLED(global_success_i);
1645 SET_EXPECT(global_success_d);
1646 SET_EXPECT(global_success_i);
1647 parse_script_a("reportSuccess()");
1648 CHECK_CALLED(global_success_d);
1649 CHECK_CALLED(global_success_i);
1651 SET_EXPECT(global_success_d);
1652 SET_EXPECT(global_success_i);
1653 parse_script_a("Call reportSuccess");
1654 CHECK_CALLED(global_success_d);
1655 CHECK_CALLED(global_success_i);
1657 SET_EXPECT(global_success_d);
1658 SET_EXPECT(global_success_i);
1659 parse_script_a("test.reportSuccess()");
1660 CHECK_CALLED(global_success_d);
1661 CHECK_CALLED(global_success_i);
1663 SET_EXPECT(global_vbvar_d);
1664 SET_EXPECT(global_vbvar_i);
1665 parse_script_a("Option Explicit\nvbvar = 3");
1666 CHECK_CALLED(global_vbvar_d);
1667 CHECK_CALLED(global_vbvar_i);
1669 SET_EXPECT(global_vbvar_d);
1670 SET_EXPECT(global_vbvar_i);
1671 parse_script_a("Option Explicit\nvbvar() = 3");
1672 CHECK_CALLED(global_vbvar_d);
1673 CHECK_CALLED(global_vbvar_i);
1675 SET_EXPECT(testobj_propget_d);
1676 SET_EXPECT(testobj_propget_i);
1677 parse_script_a("dim x\nx = testObj.propget");
1678 CHECK_CALLED(testobj_propget_d);
1679 CHECK_CALLED(testobj_propget_i);
1681 SET_EXPECT(testobj_propput_d);
1682 SET_EXPECT(testobj_propput_i);
1683 parse_script_a("testObj.propput = 1");
1684 CHECK_CALLED(testobj_propput_d);
1685 CHECK_CALLED(testobj_propput_i);
1687 SET_EXPECT(global_propargput_d);
1688 SET_EXPECT(global_propargput_i);
1689 parse_script_a("propargput(counter(), counter()) = counter()");
1690 CHECK_CALLED(global_propargput_d);
1691 CHECK_CALLED(global_propargput_i);
1693 SET_EXPECT(global_propargput_d);
1694 SET_EXPECT(global_propargput_i);
1695 parse_script_a("test.propargput(counter(), counter()) = counter()");
1696 CHECK_CALLED(global_propargput_d);
1697 CHECK_CALLED(global_propargput_i);
1699 SET_EXPECT(global_propargput1_d);
1700 SET_EXPECT(global_propargput1_i);
1701 parse_script_a("propargput1 (counter()) = counter()");
1702 CHECK_CALLED(global_propargput1_d);
1703 CHECK_CALLED(global_propargput1_i);
1705 SET_EXPECT(global_propargput1_d);
1706 SET_EXPECT(global_propargput1_i);
1707 parse_script_a("test.propargput1(counter()) = counter()");
1708 CHECK_CALLED(global_propargput1_d);
1709 CHECK_CALLED(global_propargput1_i);
1712 SET_EXPECT(collectionobj_newenum_i);
1714 parse_script_a("for each x in collectionObj\nnext");
1715 CHECK_CALLED(collectionobj_newenum_i);
1717 ok(next_cnt == 4, "next_cnt = %d\n", next_cnt);
1719 parse_script_a("x = 1\n Call ok(x = 1, \"x = \" & x)");
1721 parse_script_a("x = _ \n3");
1723 test_global_vars_ref(TRUE);
1724 test_global_vars_ref(FALSE);
1726 strict_dispid_check = FALSE;
1728 parse_script_a("Sub testsub\n"
1730 "Call ok(x = 1, \"x = \" & x)\n"
1734 run_from_res("lang.vbs");
1735 run_from_res("api.vbs");
1741 static BOOL check_vbscript(void)
1743 IActiveScriptParseProcedure2 *vbscript;
1746 hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1747 &IID_IActiveScriptParseProcedure2, (void**)&vbscript);
1749 IActiveScriptParseProcedure2_Release(vbscript);
1751 return hres == S_OK;
1759 is_english = is_lang_english();
1761 skip("Skipping some tests in non-English UIs\n");
1763 argc = winetest_get_mainargs(&argv);
1767 if(!check_vbscript()) {
1768 win_skip("Broken engine, probably too old\n");
1769 }else if(argc > 2) {
1770 run_from_file(argv[2]);