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));
304 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
305 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
306 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
308 V_VT(args) = VT_BOOL;
309 V_BOOL(args) = VARIANT_FALSE;
312 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
313 ok(hres == DISP_E_PARAMNOTOPTIONAL, "InvokeEx failed: %08x, expected DISP_E_PARAMNOTOPTIONAL\n", hres);
315 str = a2bstr("publicFunction");
316 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_func_id);
318 ok(hres == S_OK, "GetDispID(publicFunction) failed: %08x\n", hres);
319 ok(public_func_id != -1, "public_func_id = -1\n");
321 str = a2bstr("publicSub");
322 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_sub_id);
324 ok(hres == S_OK, "GetDispID(publicSub) failed: %08x\n", hres);
325 ok(public_sub_id != -1, "public_func_id = -1\n");
327 dp.cArgs = dp.cNamedArgs = 0;
328 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
329 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
330 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
331 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
333 dp.cArgs = dp.cNamedArgs = 0;
334 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
335 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
336 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
338 dp.cArgs = dp.cNamedArgs = 0;
339 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
340 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
341 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
342 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
344 dp.cArgs = dp.cNamedArgs = 0;
345 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
346 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
347 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
349 dp.cArgs = dp.cNamedArgs = 0;
350 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
351 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
352 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
354 dp.cArgs = dp.cNamedArgs = 0;
355 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
356 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
357 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
359 V_VT(args) = VT_BOOL;
360 V_BOOL(args) = VARIANT_TRUE;
361 dp.cArgs = dp.cNamedArgs = 1;
362 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
363 ok(FAILED(hres), "InvokeEx succeeded: %08x\n", hres);
365 dp.cArgs = dp.cNamedArgs = 0;
366 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
367 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
368 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
369 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
371 dp.cArgs = dp.cNamedArgs = 0;
372 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, 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_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
379 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
380 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
382 dp.cArgs = dp.cNamedArgs = 0;
383 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
384 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
385 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
387 str = a2bstr("privateSub");
388 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
390 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateSub) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
391 ok(id == -1, "id = %d\n", id);
393 str = a2bstr("dynprop");
394 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive|fdexNameEnsure, &id);
395 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
396 ok(id == -1, "id = %d\n", id);
397 hres = IDispatchEx_GetDispID(dispex, str, fdexNameEnsure, &id);
398 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
399 ok(id == -1, "id = %d\n", id);
402 str = a2bstr("publicProp");
403 hres = IDispatchEx_GetDispID(dispex, str, 0x80000000|fdexNameCaseInsensitive, &public_prop_id);
405 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
408 str = a2bstr("publicProp");
409 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
411 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
412 ok(id == public_prop_id, "id = %d, expected %d\n", id, public_prop_id);
415 str = a2bstr("publicprop");
416 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
418 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
419 ok(id == public_prop_id, "id = %d, expected %d\n", id, public_prop_id);
421 IDispatchEx_Release(dispex);
424 #define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
425 static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
427 ok_(__FILE__,line)(grfdex == expect, "grfdex = %x, expected %x\n", grfdex, expect);
430 static IDispatchEx enumDisp;
432 static HRESULT WINAPI EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
434 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumVARIANT)) {
439 if(IsEqualGUID(riid, &IID_IDispatch)) {
444 ok(0, "unexpected call %s\n", debugstr_guid(riid));
445 return E_NOINTERFACE;
448 static ULONG WINAPI EnumVARIANT_AddRef(IEnumVARIANT *iface)
453 static ULONG WINAPI EnumVARIANT_Release(IEnumVARIANT *iface)
458 static unsigned next_cnt;
460 static HRESULT WINAPI EnumVARIANT_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
462 if(strict_dispid_check)
465 ok(celt == 1, "celt = %d\n", celt);
466 ok(V_VT(rgVar) == VT_EMPTY, "V_VT(rgVar) = %d\n", V_VT(rgVar));
467 ok(!pCeltFetched, "pCeltFetched = %p\n", pCeltFetched);
471 V_I2(rgVar) = next_cnt;
478 static HRESULT WINAPI EnumVARIANT_Skip(IEnumVARIANT *iface, ULONG celt)
480 ok(0, "unexpected call\n");
484 static HRESULT WINAPI EnumVARIANT_Reset(IEnumVARIANT *iface)
486 ok(0, "unexpected call\n");
490 static HRESULT WINAPI EnumVARIANT_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum)
492 ok(0, "unexpected call\n");
496 static const IEnumVARIANTVtbl EnumVARIANTVtbl = {
497 EnumVARIANT_QueryInterface,
506 static IEnumVARIANT enumObj = { &EnumVARIANTVtbl };
508 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
512 if(IsEqualGUID(riid, &IID_IUnknown)
513 || IsEqualGUID(riid, &IID_IDispatch)
514 || IsEqualGUID(riid, &IID_IDispatchEx))
517 trace("QI %s\n", debugstr_guid(riid));
518 return E_NOINTERFACE;
521 IUnknown_AddRef((IUnknown*)*ppv);
525 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
530 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
535 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
537 ok(0, "unexpected call\n");
541 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
542 LCID lcid, ITypeInfo **ppTInfo)
544 ok(0, "unexpected call\n");
548 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
549 LPOLESTR *rgszNames, UINT cNames,
550 LCID lcid, DISPID *rgDispId)
552 ok(0, "unexpected call\n");
556 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
557 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
558 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
560 ok(0, "unexpected call\n");
564 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
566 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
570 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
572 ok(0, "unexpected call\n");
576 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
578 ok(0, "unexpected call\n");
582 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
584 ok(0, "unexpected call\n");
588 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
590 ok(0, "unexpected call\n");
594 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
596 ok(0, "unexpected call\n");
600 static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
602 ok(0, "unexpected call\n");
606 static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
607 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
609 ok(0, "unexpected call %d\n", id);
613 static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
615 if(!strcmp_wa(bstrName, "propget")) {
616 CHECK_EXPECT(testobj_propget_d);
617 test_grfdex(grfdex, fdexNameCaseInsensitive);
618 *pid = DISPID_TESTOBJ_PROPGET;
621 if(!strcmp_wa(bstrName, "propput")) {
622 CHECK_EXPECT(testobj_propput_d);
623 test_grfdex(grfdex, fdexNameCaseInsensitive);
624 *pid = DISPID_TESTOBJ_PROPPUT;
628 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
629 return DISP_E_UNKNOWNNAME;
632 static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
633 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
636 case DISPID_TESTOBJ_PROPGET:
637 CHECK_EXPECT(testobj_propget_i);
639 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
640 ok(pdp != NULL, "pdp == NULL\n");
641 ok(!pdp->rgvarg, "rgvarg == NULL\n");
642 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
643 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
644 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
645 ok(pvarRes != NULL, "pvarRes == NULL\n");
646 ok(pei != NULL, "pei == NULL\n");
648 V_VT(pvarRes) = VT_I2;
651 case DISPID_TESTOBJ_PROPPUT:
652 CHECK_EXPECT(testobj_propput_i);
654 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
655 ok(pdp != NULL, "pdp == NULL\n");
656 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
657 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
658 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
659 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
660 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
661 ok(!pvarRes, "pvarRes != NULL\n");
662 ok(pei != NULL, "pei == NULL\n");
664 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
665 ok(V_I2(pdp->rgvarg) == 1, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
669 ok(0, "unexpected call %d\n", id);
673 static IDispatchExVtbl testObjVtbl = {
674 DispatchEx_QueryInterface,
677 DispatchEx_GetTypeInfoCount,
678 DispatchEx_GetTypeInfo,
679 DispatchEx_GetIDsOfNames,
683 DispatchEx_DeleteMemberByName,
684 DispatchEx_DeleteMemberByDispID,
685 DispatchEx_GetMemberProperties,
686 DispatchEx_GetMemberName,
687 DispatchEx_GetNextDispID,
688 DispatchEx_GetNameSpaceParent
691 static IDispatchEx testObj = { &testObjVtbl };
693 static HRESULT WINAPI enumDisp_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
695 return IEnumVARIANT_QueryInterface(&enumObj, riid, ppv);
698 static IDispatchExVtbl enumDispVtbl = {
699 enumDisp_QueryInterface,
702 DispatchEx_GetTypeInfoCount,
703 DispatchEx_GetTypeInfo,
704 DispatchEx_GetIDsOfNames,
706 DispatchEx_GetDispID,
708 DispatchEx_DeleteMemberByName,
709 DispatchEx_DeleteMemberByDispID,
710 DispatchEx_GetMemberProperties,
711 DispatchEx_GetMemberName,
712 DispatchEx_GetNextDispID,
713 DispatchEx_GetNameSpaceParent
716 static IDispatchEx enumDisp = { &enumDispVtbl };
718 static HRESULT WINAPI collectionObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
720 if(!strcmp_wa(bstrName, "reset")) {
721 *pid = DISPID_COLLOBJ_RESET;
725 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
726 return DISP_E_UNKNOWNNAME;
729 static HRESULT WINAPI collectionObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
730 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
734 if(strict_dispid_check)
735 CHECK_EXPECT(collectionobj_newenum_i);
737 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
738 ok(pdp != NULL, "pdp == NULL\n");
739 ok(!pdp->rgvarg, "rgvarg == NULL\n");
740 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
741 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
742 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
743 ok(pvarRes != NULL, "pvarRes == NULL\n");
744 ok(pei != NULL, "pei == NULL\n");
746 V_VT(pvarRes) = VT_UNKNOWN;
747 V_UNKNOWN(pvarRes) = (IUnknown*)&enumObj;
749 case DISPID_COLLOBJ_RESET:
754 ok(0, "unexpected call %d\n", id);
758 static IDispatchExVtbl collectionObjVtbl = {
759 DispatchEx_QueryInterface,
762 DispatchEx_GetTypeInfoCount,
763 DispatchEx_GetTypeInfo,
764 DispatchEx_GetIDsOfNames,
766 collectionObj_GetDispID,
767 collectionObj_InvokeEx,
768 DispatchEx_DeleteMemberByName,
769 DispatchEx_DeleteMemberByDispID,
770 DispatchEx_GetMemberProperties,
771 DispatchEx_GetMemberName,
772 DispatchEx_GetNextDispID,
773 DispatchEx_GetNameSpaceParent
776 static IDispatchEx collectionObj = { &collectionObjVtbl };
778 static ULONG refobj_ref;
780 static ULONG WINAPI RefObj_AddRef(IDispatchEx *iface)
785 static ULONG WINAPI RefObj_Release(IDispatchEx *iface)
790 static IDispatchExVtbl RefObjVtbl = {
791 DispatchEx_QueryInterface,
794 DispatchEx_GetTypeInfoCount,
795 DispatchEx_GetTypeInfo,
796 DispatchEx_GetIDsOfNames,
798 DispatchEx_GetDispID,
800 DispatchEx_DeleteMemberByName,
801 DispatchEx_DeleteMemberByDispID,
802 DispatchEx_GetMemberProperties,
803 DispatchEx_GetMemberName,
804 DispatchEx_GetNextDispID,
805 DispatchEx_GetNameSpaceParent
808 static IDispatchEx RefObj = { &RefObjVtbl };
810 static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
812 if(!strcmp_wa(bstrName, "ok")) {
813 test_grfdex(grfdex, fdexNameCaseInsensitive);
814 *pid = DISPID_GLOBAL_OK;
817 if(!strcmp_wa(bstrName, "trace")) {
818 test_grfdex(grfdex, fdexNameCaseInsensitive);
819 *pid = DISPID_GLOBAL_TRACE;
822 if(!strcmp_wa(bstrName, "reportSuccess")) {
823 CHECK_EXPECT(global_success_d);
824 test_grfdex(grfdex, fdexNameCaseInsensitive);
825 *pid = DISPID_GLOBAL_REPORTSUCCESS;
828 if(!strcmp_wa(bstrName, "getVT")) {
829 test_grfdex(grfdex, fdexNameCaseInsensitive);
830 *pid = DISPID_GLOBAL_GETVT;
833 if(!strcmp_wa(bstrName, "isEnglishLang")) {
834 test_grfdex(grfdex, fdexNameCaseInsensitive);
835 *pid = DISPID_GLOBAL_ISENGLANG;
838 if(!strcmp_wa(bstrName, "testObj")) {
839 test_grfdex(grfdex, fdexNameCaseInsensitive);
840 *pid = DISPID_GLOBAL_TESTOBJ;
843 if(!strcmp_wa(bstrName, "collectionObj")) {
844 test_grfdex(grfdex, fdexNameCaseInsensitive);
845 *pid = DISPID_GLOBAL_COLLOBJ;
848 if(!strcmp_wa(bstrName, "vbvar")) {
849 CHECK_EXPECT(global_vbvar_d);
850 test_grfdex(grfdex, fdexNameCaseInsensitive);
851 *pid = DISPID_GLOBAL_VBVAR;
854 if(!strcmp_wa(bstrName, "isNullDisp")) {
855 test_grfdex(grfdex, fdexNameCaseInsensitive);
856 *pid = DISPID_GLOBAL_ISNULLDISP;
859 if(!strcmp_wa(bstrName, "testDisp")) {
860 test_grfdex(grfdex, fdexNameCaseInsensitive);
861 *pid = DISPID_GLOBAL_TESTDISP;
864 if(!strcmp_wa(bstrName, "RefObj")) {
865 test_grfdex(grfdex, fdexNameCaseInsensitive);
866 *pid = DISPID_GLOBAL_REFOBJ;
869 if(!strcmp_wa(bstrName, "propargput")) {
870 CHECK_EXPECT(global_propargput_d);
871 test_grfdex(grfdex, fdexNameCaseInsensitive);
872 *pid = DISPID_GLOBAL_PROPARGPUT;
875 if(!strcmp_wa(bstrName, "propargput1")) {
876 CHECK_EXPECT(global_propargput1_d);
877 test_grfdex(grfdex, fdexNameCaseInsensitive);
878 *pid = DISPID_GLOBAL_PROPARGPUT1;
881 if(!strcmp_wa(bstrName, "counter")) {
882 test_grfdex(grfdex, fdexNameCaseInsensitive);
883 *pid = DISPID_GLOBAL_COUNTER;
886 if(!strcmp_wa(bstrName, "doubleAsString")) {
887 test_grfdex(grfdex, fdexNameCaseInsensitive);
888 *pid = DISPID_GLOBAL_DOUBLEASSTRING;
892 if(strict_dispid_check && strcmp_wa(bstrName, "x"))
893 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
894 return DISP_E_UNKNOWNNAME;
897 static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
898 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
901 case DISPID_GLOBAL_OK: {
904 ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
905 ok(pdp != NULL, "pdp == NULL\n");
906 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
907 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
908 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
909 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
910 if(wFlags & INVOKE_PROPERTYGET)
911 ok(pvarRes != NULL, "pvarRes == NULL\n");
913 ok(!pvarRes, "pvarRes != NULL\n");
914 ok(pei != NULL, "pei == NULL\n");
916 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
919 if(V_VT(b) == (VT_BYREF|VT_VARIANT))
922 ok(V_VT(b) == VT_BOOL, "V_VT(b) = %d\n", V_VT(b));
924 ok(V_BOOL(b), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
928 case DISPID_GLOBAL_TRACE:
929 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
930 ok(pdp != NULL, "pdp == NULL\n");
931 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
932 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
933 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
934 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
935 ok(!pvarRes, "pvarRes != NULL\n");
936 ok(pei != NULL, "pei == NULL\n");
938 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
939 if(V_VT(pdp->rgvarg) == VT_BSTR)
940 trace("%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
944 case DISPID_GLOBAL_REPORTSUCCESS:
945 CHECK_EXPECT(global_success_i);
947 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
948 ok(pdp != NULL, "pdp == NULL\n");
949 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
950 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
951 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
952 ok(!pvarRes, "pvarRes != NULL\n");
953 ok(pei != NULL, "pei == NULL\n");
957 case DISPID_GLOBAL_GETVT:
958 ok(pdp != NULL, "pdp == NULL\n");
959 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
960 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
961 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
962 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
963 ok(pvarRes != NULL, "pvarRes == NULL\n");
964 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
965 ok(pei != NULL, "pei == NULL\n");
967 V_VT(pvarRes) = VT_BSTR;
968 V_BSTR(pvarRes) = a2bstr(vt2a(pdp->rgvarg));
971 case DISPID_GLOBAL_ISENGLANG:
972 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
973 ok(pdp != NULL, "pdp == NULL\n");
974 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
975 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
976 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
977 ok(pvarRes != NULL, "pvarRes == NULL\n");
978 ok(pei != NULL, "pei == NULL\n");
980 V_VT(pvarRes) = VT_BOOL;
981 V_BOOL(pvarRes) = is_english ? VARIANT_TRUE : VARIANT_FALSE;
984 case DISPID_GLOBAL_VBVAR:
985 CHECK_EXPECT(global_vbvar_i);
987 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
988 ok(pdp != NULL, "pdp == NULL\n");
989 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
990 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
991 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
992 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
993 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
994 ok(!pvarRes, "pvarRes != NULL\n");
995 ok(pei != NULL, "pei == NULL\n");
997 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
998 ok(V_I2(pdp->rgvarg) == 3, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1001 case DISPID_GLOBAL_TESTOBJ:
1002 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1004 ok(pdp != NULL, "pdp == NULL\n");
1005 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1006 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1007 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1008 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1009 ok(pvarRes != NULL, "pvarRes == NULL\n");
1010 ok(pei != NULL, "pei == NULL\n");
1012 V_VT(pvarRes) = VT_DISPATCH;
1013 V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
1016 case DISPID_GLOBAL_COLLOBJ:
1017 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1019 ok(pdp != NULL, "pdp == NULL\n");
1020 ok(!pdp->rgvarg, "rgvarg != NULL\n");
1021 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1022 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1023 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1024 ok(pvarRes != NULL, "pvarRes == NULL\n");
1025 ok(pei != NULL, "pei == NULL\n");
1027 V_VT(pvarRes) = VT_DISPATCH;
1028 V_DISPATCH(pvarRes) = (IDispatch*)&collectionObj;
1031 case DISPID_GLOBAL_REFOBJ:
1032 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
1034 ok(pdp != NULL, "pdp == NULL\n");
1035 ok(!pdp->rgvarg, "rgvarg == NULL\n");
1036 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1037 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1038 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1039 ok(pvarRes != NULL, "pvarRes == NULL\n");
1040 ok(pei != NULL, "pei == NULL\n");
1042 IDispatchEx_AddRef(&RefObj);
1043 V_VT(pvarRes) = VT_DISPATCH;
1044 V_DISPATCH(pvarRes) = (IDispatch*)&RefObj;
1047 case DISPID_GLOBAL_ISNULLDISP: {
1050 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1051 ok(pdp != NULL, "pdp == NULL\n");
1052 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1053 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1054 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1055 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1056 ok(pvarRes != NULL, "pvarRes == NULL\n");
1057 ok(pei != NULL, "pei == NULL\n");
1060 if(V_VT(v) == (VT_VARIANT|VT_BYREF))
1061 v = V_VARIANTREF(v);
1063 ok(V_VT(v) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1064 V_VT(pvarRes) = VT_BOOL;
1065 V_BOOL(pvarRes) = V_DISPATCH(v) ? VARIANT_FALSE : VARIANT_TRUE;
1069 case DISPID_GLOBAL_TESTDISP:
1070 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1071 ok(pdp != NULL, "pdp == NULL\n");
1072 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1073 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1074 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1075 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1076 ok(!pvarRes, "pvarRes != NULL\n");
1077 ok(pei != NULL, "pei == NULL\n");
1079 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1080 test_disp(V_DISPATCH(pdp->rgvarg));
1083 case DISPID_GLOBAL_PROPARGPUT:
1084 CHECK_EXPECT(global_propargput_i);
1086 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1087 ok(pdp != NULL, "pdp == NULL\n");
1088 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1089 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1090 ok(pdp->cArgs == 3, "cArgs = %d\n", pdp->cArgs);
1091 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1092 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1093 ok(!pvarRes, "pvarRes != NULL\n");
1094 ok(pei != NULL, "pei == NULL\n");
1096 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1097 ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1099 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1100 ok(V_I2(pdp->rgvarg+1) == 2, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1102 ok(V_VT(pdp->rgvarg+2) == VT_I2, "V_VT(psp->rgvargs+2) = %d\n", V_VT(pdp->rgvarg+2));
1103 ok(V_I2(pdp->rgvarg+2) == 1, "V_I2(psp->rgvargs+2) = %d\n", V_I2(pdp->rgvarg+2));
1106 case DISPID_GLOBAL_PROPARGPUT1:
1107 CHECK_EXPECT(global_propargput1_i);
1109 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1110 ok(pdp != NULL, "pdp == NULL\n");
1111 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1112 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1113 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1114 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1115 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1116 ok(!pvarRes, "pvarRes != NULL\n");
1117 ok(pei != NULL, "pei == NULL\n");
1119 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1120 ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1122 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1123 ok(V_I2(pdp->rgvarg+1) == 1, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1127 case DISPID_GLOBAL_COUNTER:
1128 ok(pdp != NULL, "pdp == NULL\n");
1129 todo_wine ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1130 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1131 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1132 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1133 ok(pvarRes != NULL, "pvarRes == NULL\n");
1134 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1135 ok(pei != NULL, "pei == NULL\n");
1137 V_VT(pvarRes) = VT_I2;
1138 V_I2(pvarRes) = test_counter++;
1141 case DISPID_GLOBAL_DOUBLEASSTRING:
1142 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1143 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1144 ok(V_VT(pdp->rgvarg) == VT_R8, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1145 ok(pvarRes != NULL, "pvarRes == NULL\n");
1147 V_VT(pvarRes) = VT_BSTR;
1148 return VarBstrFromR8(V_R8(pdp->rgvarg), 0, 0, &V_BSTR(pvarRes));
1151 ok(0, "unexpected call %d\n", id);
1152 return DISP_E_MEMBERNOTFOUND;
1155 static IDispatchExVtbl GlobalVtbl = {
1156 DispatchEx_QueryInterface,
1159 DispatchEx_GetTypeInfoCount,
1160 DispatchEx_GetTypeInfo,
1161 DispatchEx_GetIDsOfNames,
1165 DispatchEx_DeleteMemberByName,
1166 DispatchEx_DeleteMemberByDispID,
1167 DispatchEx_GetMemberProperties,
1168 DispatchEx_GetMemberName,
1169 DispatchEx_GetNextDispID,
1170 DispatchEx_GetNameSpaceParent
1173 static IDispatchEx Global = { &GlobalVtbl };
1175 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
1179 if(IsEqualGUID(&IID_IUnknown, riid))
1181 else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
1184 return E_NOINTERFACE;
1186 IUnknown_AddRef((IUnknown*)*ppv);
1190 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
1195 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
1200 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
1202 *plcid = GetUserDefaultLCID();
1206 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
1207 DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
1209 ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
1210 ok(!ppti, "ppti != NULL\n");
1212 if(strcmp_wa(pstrName, "test"))
1213 ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName));
1215 *ppiunkItem = (IUnknown*)&Global;
1219 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
1224 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
1225 const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
1230 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
1235 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
1240 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
1245 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
1250 #undef ACTSCPSITE_THIS
1252 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
1253 ActiveScriptSite_QueryInterface,
1254 ActiveScriptSite_AddRef,
1255 ActiveScriptSite_Release,
1256 ActiveScriptSite_GetLCID,
1257 ActiveScriptSite_GetItemInfo,
1258 ActiveScriptSite_GetDocVersionString,
1259 ActiveScriptSite_OnScriptTerminate,
1260 ActiveScriptSite_OnStateChange,
1261 ActiveScriptSite_OnScriptError,
1262 ActiveScriptSite_OnEnterScript,
1263 ActiveScriptSite_OnLeaveScript
1266 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
1268 static IActiveScript *create_script(void)
1270 IActiveScript *script;
1273 hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1274 &IID_IActiveScript, (void**)&script);
1275 ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
1280 static IActiveScript *create_and_init_script(DWORD flags)
1282 IActiveScriptParse *parser;
1283 IActiveScript *engine;
1286 engine = create_script();
1290 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1291 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1293 hres = IActiveScriptParse_InitNew(parser);
1294 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1296 IActiveScriptParse_Release(parser);
1298 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1299 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1301 hres = IActiveScript_AddNamedItem(engine, testW,
1302 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
1303 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1305 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1306 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1311 static void close_script(IActiveScript *script)
1316 hres = IActiveScript_Close(script);
1317 ok(hres == S_OK, "Close failed: %08x\n", hres);
1319 ref = IActiveScript_Release(script);
1320 ok(!ref, "ref=%u\n", ref);
1323 static HRESULT parse_script(DWORD flags, BSTR script_str)
1325 IActiveScriptParse *parser;
1326 IActiveScript *engine;
1327 IDispatch *script_disp;
1331 engine = create_and_init_script(flags);
1335 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1336 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1339 IActiveScript_Release(engine);
1343 hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
1344 ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
1345 ok(script_disp != NULL, "script_disp == NULL\n");
1346 ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
1350 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1352 IActiveScript_Close(engine);
1354 IDispatch_Release(script_disp);
1355 IActiveScript_Release(engine);
1357 ref = IActiveScriptParse_Release(parser);
1358 ok(!ref, "ref=%d\n", ref);
1362 static void parse_script_af(DWORD flags, const char *src)
1368 hres = parse_script(flags, tmp);
1370 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1373 static void parse_script_a(const char *src)
1375 parse_script_af(SCRIPTITEM_GLOBALMEMBERS, src);
1378 static IDispatchEx *parse_procedure(IActiveScriptParseProcedure2 *parse_proc, const char *src)
1380 IDispatchEx *dispex;
1385 static const WCHAR delimiterW[] = {'\"',0};
1388 hres = IActiveScriptParseProcedure2_ParseProcedureText(parse_proc, str, NULL, emptyW, NULL, NULL, delimiterW, 0, 0,
1389 SCRIPTPROC_HOSTMANAGESSOURCE|SCRIPTPROC_IMPLICIT_THIS|SCRIPTPROC_IMPLICIT_PARENTS, &disp);
1391 ok(hres == S_OK, "ParseProcedureText failed: %08x\n", hres);
1392 ok(disp != NULL, "disp = NULL\n");
1394 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
1395 IDispatch_Release(disp);
1396 ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
1402 static void test_procedures(void)
1404 IActiveScriptParseProcedure2 *parse_proc;
1405 DISPPARAMS dp = {NULL};
1406 IActiveScript *script;
1412 script = create_and_init_script(0);
1414 hres = IActiveScript_QueryInterface(script, &IID_IActiveScriptParseProcedure2, (void**)&parse_proc);
1415 ok(hres == S_OK, "Could not get IActiveScriptParseProcedure2 iface: %08x\n", hres);
1417 proc = parse_procedure(parse_proc, "dim x\nif true then x=false");
1419 V_VT(&v) = VT_EMPTY;
1420 hres = IDispatchEx_InvokeEx(proc, DISPID_VALUE, 0, DISPATCH_METHOD, &dp, &v, &ei, &caller_sp);
1421 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
1423 IDispatchEx_Release(proc);
1425 IActiveScriptParseProcedure2_Release(parse_proc);
1427 close_script(script);
1430 static void test_gc(void)
1432 IActiveScriptParse *parser;
1433 IActiveScript *engine;
1437 strict_dispid_check = FALSE;
1439 engine = create_script();
1443 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1444 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1446 hres = IActiveScriptParse_InitNew(parser);
1447 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1449 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1450 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1452 hres = IActiveScript_AddNamedItem(engine, testW,
1453 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1454 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1456 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1457 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1462 " Public Sub Class_Terminate\n"
1463 " Call reportSuccess()\n"
1469 "set x = nothing\n");
1471 hres = IActiveScriptParse_ParseScriptText(parser, src, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1472 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1475 SET_EXPECT(global_success_d);
1476 SET_EXPECT(global_success_i);
1477 IActiveScript_Close(engine);
1478 CHECK_CALLED(global_success_d);
1479 CHECK_CALLED(global_success_i);
1481 IActiveScript_Release(engine);
1482 IActiveScriptParse_Release(parser);
1485 static HRESULT test_global_vars_ref(BOOL use_close)
1487 IActiveScriptParse *parser;
1488 IActiveScript *engine;
1493 engine = create_script();
1497 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1498 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1501 IActiveScript_Release(engine);
1505 hres = IActiveScriptParse_InitNew(parser);
1506 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1508 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1509 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1511 hres = IActiveScript_AddNamedItem(engine, testW, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1512 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1514 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1515 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1519 script_str = a2bstr("Dim x\nset x = RefObj\n");
1520 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1521 SysFreeString(script_str);
1523 ok(refobj_ref, "refobj_ref = 0\n");
1526 hres = IActiveScript_Close(engine);
1527 ok(hres == S_OK, "Close failed: %08x\n", hres);
1529 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_UNINITIALIZED);
1530 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1533 ok(!refobj_ref, "refobj_ref = %d\n", refobj_ref);
1535 IActiveScript_Release(engine);
1537 ref = IActiveScriptParse_Release(parser);
1538 ok(!ref, "ref=%d\n", ref);
1542 static BSTR get_script_from_file(const char *filename)
1546 const char *file_map;
1549 file = CreateFileA(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
1550 if(file == INVALID_HANDLE_VALUE) {
1551 trace("Could not open file: %u\n", GetLastError());
1555 size = GetFileSize(file, NULL);
1557 map = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL);
1559 if(map == INVALID_HANDLE_VALUE) {
1560 trace("Could not create file mapping: %u\n", GetLastError());
1564 file_map = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
1567 trace("MapViewOfFile failed: %u\n", GetLastError());
1571 len = MultiByteToWideChar(CP_ACP, 0, file_map, size, NULL, 0);
1572 ret = SysAllocStringLen(NULL, len);
1573 MultiByteToWideChar(CP_ACP, 0, file_map, size, ret, len);
1575 UnmapViewOfFile(file_map);
1580 static void run_from_file(const char *filename)
1585 script_str = get_script_from_file(filename);
1589 strict_dispid_check = FALSE;
1590 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str);
1591 SysFreeString(script_str);
1592 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1595 static void run_from_res(const char *name)
1603 strict_dispid_check = FALSE;
1606 src = FindResourceA(NULL, name, (LPCSTR)40);
1607 ok(src != NULL, "Could not find resource %s\n", name);
1609 size = SizeofResource(NULL, src);
1610 data = LoadResource(NULL, src);
1612 len = MultiByteToWideChar(CP_ACP, 0, data, size, NULL, 0);
1613 str = SysAllocStringLen(NULL, len);
1614 MultiByteToWideChar(CP_ACP, 0, data, size, str, len);
1616 SET_EXPECT(global_success_d);
1617 SET_EXPECT(global_success_i);
1618 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str);
1619 CHECK_CALLED(global_success_d);
1620 CHECK_CALLED(global_success_i);
1622 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1626 static void run_tests(void)
1628 strict_dispid_check = TRUE;
1631 parse_script_a("' empty ;");
1633 SET_EXPECT(global_success_d);
1634 SET_EXPECT(global_success_i);
1635 parse_script_a("reportSuccess");
1636 CHECK_CALLED(global_success_d);
1637 CHECK_CALLED(global_success_i);
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("Call 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("test.reportSuccess()");
1654 CHECK_CALLED(global_success_d);
1655 CHECK_CALLED(global_success_i);
1657 SET_EXPECT(global_vbvar_d);
1658 SET_EXPECT(global_vbvar_i);
1659 parse_script_a("Option Explicit\nvbvar = 3");
1660 CHECK_CALLED(global_vbvar_d);
1661 CHECK_CALLED(global_vbvar_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(testobj_propget_d);
1670 SET_EXPECT(testobj_propget_i);
1671 parse_script_a("dim x\nx = testObj.propget");
1672 CHECK_CALLED(testobj_propget_d);
1673 CHECK_CALLED(testobj_propget_i);
1675 SET_EXPECT(testobj_propput_d);
1676 SET_EXPECT(testobj_propput_i);
1677 parse_script_a("testObj.propput = 1");
1678 CHECK_CALLED(testobj_propput_d);
1679 CHECK_CALLED(testobj_propput_i);
1681 SET_EXPECT(global_propargput_d);
1682 SET_EXPECT(global_propargput_i);
1683 parse_script_a("propargput(counter(), counter()) = counter()");
1684 CHECK_CALLED(global_propargput_d);
1685 CHECK_CALLED(global_propargput_i);
1687 SET_EXPECT(global_propargput_d);
1688 SET_EXPECT(global_propargput_i);
1689 parse_script_a("test.propargput(counter(), counter()) = counter()");
1690 CHECK_CALLED(global_propargput_d);
1691 CHECK_CALLED(global_propargput_i);
1693 SET_EXPECT(global_propargput1_d);
1694 SET_EXPECT(global_propargput1_i);
1695 parse_script_a("propargput1 (counter()) = counter()");
1696 CHECK_CALLED(global_propargput1_d);
1697 CHECK_CALLED(global_propargput1_i);
1699 SET_EXPECT(global_propargput1_d);
1700 SET_EXPECT(global_propargput1_i);
1701 parse_script_a("test.propargput1(counter()) = counter()");
1702 CHECK_CALLED(global_propargput1_d);
1703 CHECK_CALLED(global_propargput1_i);
1706 SET_EXPECT(collectionobj_newenum_i);
1708 parse_script_a("for each x in collectionObj\nnext");
1709 CHECK_CALLED(collectionobj_newenum_i);
1711 ok(next_cnt == 4, "next_cnt = %d\n", next_cnt);
1713 parse_script_a("x = 1\n Call ok(x = 1, \"x = \" & x)");
1715 parse_script_a("x = _ \n3");
1717 test_global_vars_ref(TRUE);
1718 test_global_vars_ref(FALSE);
1720 strict_dispid_check = FALSE;
1722 parse_script_a("Sub testsub\n"
1724 "Call ok(x = 1, \"x = \" & x)\n"
1728 run_from_res("lang.vbs");
1729 run_from_res("api.vbs");
1735 static BOOL check_vbscript(void)
1737 IActiveScript *vbscript;
1740 hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1741 &IID_IActiveScript, (void**)&vbscript);
1743 IActiveScript_Release(vbscript);
1745 return hres == S_OK;
1753 is_english = is_lang_english();
1755 skip("Skipping some tests in non-English UIs\n");
1757 argc = winetest_get_mainargs(&argv);
1761 if(!check_vbscript()) {
1762 win_skip("Broken engine, probably too old\n");
1763 }else if(argc > 2) {
1764 run_from_file(argv[2]);