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"
30 extern const CLSID CLSID_VBScript;
32 #define DEFINE_EXPECT(func) \
33 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
35 #define SET_EXPECT(func) \
36 expect_ ## func = TRUE
38 #define CHECK_EXPECT2(func) \
40 ok(expect_ ##func, "unexpected call " #func "\n"); \
41 called_ ## func = TRUE; \
44 #define CHECK_EXPECT(func) \
46 CHECK_EXPECT2(func); \
47 expect_ ## func = FALSE; \
50 #define CHECK_CALLED(func) \
52 ok(called_ ## func, "expected " #func "\n"); \
53 expect_ ## func = called_ ## func = FALSE; \
56 DEFINE_EXPECT(global_success_d);
57 DEFINE_EXPECT(global_success_i);
58 DEFINE_EXPECT(global_vbvar_d);
59 DEFINE_EXPECT(global_vbvar_i);
60 DEFINE_EXPECT(testobj_propget_d);
61 DEFINE_EXPECT(testobj_propget_i);
62 DEFINE_EXPECT(testobj_propput_d);
63 DEFINE_EXPECT(testobj_propput_i);
64 DEFINE_EXPECT(global_propargput_d);
65 DEFINE_EXPECT(global_propargput_i);
66 DEFINE_EXPECT(global_propargput1_d);
67 DEFINE_EXPECT(global_propargput1_i);
68 DEFINE_EXPECT(collectionobj_newenum_i);
71 #define DISPID_GLOBAL_REPORTSUCCESS 1000
72 #define DISPID_GLOBAL_TRACE 1001
73 #define DISPID_GLOBAL_OK 1002
74 #define DISPID_GLOBAL_GETVT 1003
75 #define DISPID_GLOBAL_ISENGLANG 1004
76 #define DISPID_GLOBAL_VBVAR 1005
77 #define DISPID_GLOBAL_TESTOBJ 1006
78 #define DISPID_GLOBAL_ISNULLDISP 1007
79 #define DISPID_GLOBAL_TESTDISP 1008
80 #define DISPID_GLOBAL_REFOBJ 1009
81 #define DISPID_GLOBAL_COUNTER 1010
82 #define DISPID_GLOBAL_PROPARGPUT 1011
83 #define DISPID_GLOBAL_PROPARGPUT1 1012
84 #define DISPID_GLOBAL_COLLOBJ 1013
85 #define DISPID_GLOBAL_DOUBLEASSTRING 1014
87 #define DISPID_TESTOBJ_PROPGET 2000
88 #define DISPID_TESTOBJ_PROPPUT 2001
90 #define DISPID_COLLOBJ_RESET 3000
92 static const WCHAR testW[] = {'t','e','s','t',0};
94 static BOOL strict_dispid_check, is_english;
95 static const char *test_name = "(null)";
96 static int test_counter;
98 static BSTR a2bstr(const char *str)
103 len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
104 ret = SysAllocStringLen(NULL, len-1);
105 MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
110 static int strcmp_wa(LPCWSTR strw, const char *stra)
113 WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0);
114 return lstrcmpA(buf, stra);
117 static const char *vt2a(VARIANT *v)
119 if(V_VT(v) == (VT_BYREF|VT_VARIANT)) {
121 sprintf(buf, "%s*", vt2a(V_BYREF(v)));
139 return "VT_DISPATCH";
142 case VT_ARRAY|VT_VARIANT:
143 return "VT_ARRAY|VT_VARIANT";
145 ok(0, "unknown vt %d\n", V_VT(v));
150 /* Returns true if the user interface is in English. Note that this does not
151 * presume of the formatting of dates, numbers, etc.
153 static BOOL is_lang_english(void)
155 static HMODULE hkernel32 = NULL;
156 static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL;
157 static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL;
161 hkernel32 = GetModuleHandleA("kernel32.dll");
162 pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage");
163 pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage");
165 if (pGetThreadUILanguage)
166 return PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH;
167 if (pGetUserDefaultUILanguage)
168 return PRIMARYLANGID(pGetUserDefaultUILanguage()) == LANG_ENGLISH;
170 return PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
173 static void test_disp(IDispatch *disp)
175 DISPID id, public_prop_id, public_prop2_id, public_func_id, public_sub_id, defvalget_id;
176 DISPID named_args[5] = {DISPID_PROPERTYPUT};
178 DISPPARAMS dp = {args, named_args};
184 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
185 ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
187 str = a2bstr("publicProp");
188 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop_id);
190 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
192 str = a2bstr("PUBLICPROP");
193 hres = IDispatchEx_GetDispID(dispex, str, 0, &id);
195 ok(hres == S_OK, "GetDispID(PUBLICPROP) failed: %08x\n", hres);
196 ok(public_prop_id == id, "id = %d\n", public_prop_id);
198 str = a2bstr("publicPROP2");
199 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop2_id);
201 ok(hres == S_OK, "GetDispID(publicProp2) failed: %08x\n", hres);
203 str = a2bstr("defValGet");
204 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &defvalget_id);
206 ok(hres == S_OK, "GetDispID(defValGet) failed: %08x\n", hres);
207 ok(defvalget_id == DISPID_VALUE, "id = %d\n", defvalget_id);
209 str = a2bstr("privateProp");
210 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
212 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
213 ok(id == -1, "id = %d\n", id);
215 str = a2bstr("class_initialize");
216 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
218 ok(hres == S_OK, "GetDispID(publicProp2) failed: %08x\n", hres);
220 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
221 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
222 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
224 V_VT(args) = VT_BOOL;
225 V_BOOL(args) = VARIANT_TRUE;
226 dp.cArgs = dp.cNamedArgs = 1;
228 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, &v, &ei, NULL);
229 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
230 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
232 dp.cArgs = dp.cNamedArgs = 0;
233 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
234 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
235 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
236 ok(V_BOOL(&v), "V_BOOL(v) = %x\n", V_BOOL(&v));
239 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
240 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
241 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
243 V_VT(args) = VT_BOOL;
244 V_BOOL(args) = VARIANT_FALSE;
247 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
248 ok(hres == DISP_E_PARAMNOTOPTIONAL, "InvokeEx failed: %08x, expected DISP_E_PARAMNOTOPTIONAL\n", hres);
250 str = a2bstr("publicFunction");
251 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_func_id);
253 ok(hres == S_OK, "GetDispID(publicFunction) failed: %08x\n", hres);
254 ok(public_func_id != -1, "public_func_id = -1\n");
256 str = a2bstr("publicSub");
257 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_sub_id);
259 ok(hres == S_OK, "GetDispID(publicSub) failed: %08x\n", hres);
260 ok(public_sub_id != -1, "public_func_id = -1\n");
262 dp.cArgs = dp.cNamedArgs = 0;
263 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
264 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
265 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
266 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
268 dp.cArgs = dp.cNamedArgs = 0;
269 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
270 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
271 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
273 dp.cArgs = dp.cNamedArgs = 0;
274 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
275 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
276 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
277 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
279 dp.cArgs = dp.cNamedArgs = 0;
280 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
281 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
282 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
284 dp.cArgs = dp.cNamedArgs = 0;
285 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
286 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
287 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
289 dp.cArgs = dp.cNamedArgs = 0;
290 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
291 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
292 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
294 V_VT(args) = VT_BOOL;
295 V_BOOL(args) = VARIANT_TRUE;
296 dp.cArgs = dp.cNamedArgs = 1;
297 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
298 ok(FAILED(hres), "InvokeEx succeeded: %08x\n", hres);
300 dp.cArgs = dp.cNamedArgs = 0;
301 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
302 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
303 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
304 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
306 dp.cArgs = dp.cNamedArgs = 0;
307 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
308 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
309 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
310 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
312 dp.cArgs = dp.cNamedArgs = 0;
313 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
314 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
315 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
317 dp.cArgs = dp.cNamedArgs = 0;
318 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
319 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
320 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
322 str = a2bstr("privateSub");
323 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
325 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateSub) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
326 ok(id == -1, "id = %d\n", id);
328 str = a2bstr("dynprop");
329 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive|fdexNameEnsure, &id);
330 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
331 ok(id == -1, "id = %d\n", id);
332 hres = IDispatchEx_GetDispID(dispex, str, fdexNameEnsure, &id);
333 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
334 ok(id == -1, "id = %d\n", id);
337 str = a2bstr("publicProp");
338 hres = IDispatchEx_GetDispID(dispex, str, 0x80000000|fdexNameCaseInsensitive, &public_prop_id);
340 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
342 IDispatchEx_Release(dispex);
345 #define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
346 static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
348 ok_(__FILE__,line)(grfdex == expect, "grfdex = %x, expected %x\n", grfdex, expect);
351 static const char *debugstr_guid(REFIID riid)
355 sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
356 riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
357 riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
358 riid->Data4[5], riid->Data4[6], riid->Data4[7]);
363 static IDispatchEx enumDisp;
365 static HRESULT WINAPI EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
367 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumVARIANT)) {
372 if(IsEqualGUID(riid, &IID_IDispatch)) {
377 ok(0, "unexpected call %s\n", debugstr_guid(riid));
378 return E_NOINTERFACE;
381 static ULONG WINAPI EnumVARIANT_AddRef(IEnumVARIANT *iface)
386 static ULONG WINAPI EnumVARIANT_Release(IEnumVARIANT *iface)
391 static unsigned next_cnt;
393 static HRESULT WINAPI EnumVARIANT_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
395 if(strict_dispid_check)
398 ok(celt == 1, "celt = %d\n", celt);
399 ok(V_VT(rgVar) == VT_EMPTY, "V_VT(rgVar) = %d\n", V_VT(rgVar));
400 ok(!pCeltFetched, "pCeltFetched = %p\n", pCeltFetched);
404 V_I2(rgVar) = next_cnt;
411 static HRESULT WINAPI EnumVARIANT_Skip(IEnumVARIANT *iface, ULONG celt)
413 ok(0, "unexpected call\n");
417 static HRESULT WINAPI EnumVARIANT_Reset(IEnumVARIANT *iface)
419 ok(0, "unexpected call\n");
423 static HRESULT WINAPI EnumVARIANT_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum)
425 ok(0, "unexpected call\n");
429 static const IEnumVARIANTVtbl EnumVARIANTVtbl = {
430 EnumVARIANT_QueryInterface,
439 static IEnumVARIANT enumObj = { &EnumVARIANTVtbl };
441 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
445 if(IsEqualGUID(riid, &IID_IUnknown)
446 || IsEqualGUID(riid, &IID_IDispatch)
447 || IsEqualGUID(riid, &IID_IDispatchEx))
450 trace("QI %s\n", debugstr_guid(riid));
451 return E_NOINTERFACE;
454 IUnknown_AddRef((IUnknown*)*ppv);
458 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
463 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
468 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
470 ok(0, "unexpected call\n");
474 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
475 LCID lcid, ITypeInfo **ppTInfo)
477 ok(0, "unexpected call\n");
481 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
482 LPOLESTR *rgszNames, UINT cNames,
483 LCID lcid, DISPID *rgDispId)
485 ok(0, "unexpected call\n");
489 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
490 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
491 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
493 ok(0, "unexpected call\n");
497 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
499 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
503 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
505 ok(0, "unexpected call\n");
509 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
511 ok(0, "unexpected call\n");
515 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
517 ok(0, "unexpected call\n");
521 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
523 ok(0, "unexpected call\n");
527 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
529 ok(0, "unexpected call\n");
533 static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
535 ok(0, "unexpected call\n");
539 static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
540 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
542 ok(0, "unexpected call %d\n", id);
546 static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
548 if(!strcmp_wa(bstrName, "propget")) {
549 CHECK_EXPECT(testobj_propget_d);
550 test_grfdex(grfdex, fdexNameCaseInsensitive);
551 *pid = DISPID_TESTOBJ_PROPGET;
554 if(!strcmp_wa(bstrName, "propput")) {
555 CHECK_EXPECT(testobj_propput_d);
556 test_grfdex(grfdex, fdexNameCaseInsensitive);
557 *pid = DISPID_TESTOBJ_PROPPUT;
561 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
562 return DISP_E_UNKNOWNNAME;
565 static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
566 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
569 case DISPID_TESTOBJ_PROPGET:
570 CHECK_EXPECT(testobj_propget_i);
572 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
573 ok(pdp != NULL, "pdp == NULL\n");
574 ok(!pdp->rgvarg, "rgvarg == NULL\n");
575 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
576 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
577 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
578 ok(pvarRes != NULL, "pvarRes == NULL\n");
579 ok(pei != NULL, "pei == NULL\n");
581 V_VT(pvarRes) = VT_I2;
584 case DISPID_TESTOBJ_PROPPUT:
585 CHECK_EXPECT(testobj_propput_i);
587 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
588 ok(pdp != NULL, "pdp == NULL\n");
589 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
590 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
591 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
592 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
593 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
594 ok(!pvarRes, "pvarRes != NULL\n");
595 ok(pei != NULL, "pei == NULL\n");
597 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
598 ok(V_I2(pdp->rgvarg) == 1, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
602 ok(0, "unexpected call %d\n", id);
606 static IDispatchExVtbl testObjVtbl = {
607 DispatchEx_QueryInterface,
610 DispatchEx_GetTypeInfoCount,
611 DispatchEx_GetTypeInfo,
612 DispatchEx_GetIDsOfNames,
616 DispatchEx_DeleteMemberByName,
617 DispatchEx_DeleteMemberByDispID,
618 DispatchEx_GetMemberProperties,
619 DispatchEx_GetMemberName,
620 DispatchEx_GetNextDispID,
621 DispatchEx_GetNameSpaceParent
624 static IDispatchEx testObj = { &testObjVtbl };
626 static HRESULT WINAPI enumDisp_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
628 return IEnumVARIANT_QueryInterface(&enumObj, riid, ppv);
631 static IDispatchExVtbl enumDispVtbl = {
632 enumDisp_QueryInterface,
635 DispatchEx_GetTypeInfoCount,
636 DispatchEx_GetTypeInfo,
637 DispatchEx_GetIDsOfNames,
639 DispatchEx_GetDispID,
641 DispatchEx_DeleteMemberByName,
642 DispatchEx_DeleteMemberByDispID,
643 DispatchEx_GetMemberProperties,
644 DispatchEx_GetMemberName,
645 DispatchEx_GetNextDispID,
646 DispatchEx_GetNameSpaceParent
649 static IDispatchEx enumDisp = { &enumDispVtbl };
651 static HRESULT WINAPI collectionObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
653 if(!strcmp_wa(bstrName, "reset")) {
654 *pid = DISPID_COLLOBJ_RESET;
658 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
659 return DISP_E_UNKNOWNNAME;
662 static HRESULT WINAPI collectionObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
663 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
667 if(strict_dispid_check)
668 CHECK_EXPECT(collectionobj_newenum_i);
670 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
671 ok(pdp != NULL, "pdp == NULL\n");
672 ok(!pdp->rgvarg, "rgvarg == NULL\n");
673 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
674 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
675 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
676 ok(pvarRes != NULL, "pvarRes == NULL\n");
677 ok(pei != NULL, "pei == NULL\n");
679 V_VT(pvarRes) = VT_UNKNOWN;
680 V_UNKNOWN(pvarRes) = (IUnknown*)&enumObj;
682 case DISPID_COLLOBJ_RESET:
687 ok(0, "unexpected call %d\n", id);
691 static IDispatchExVtbl collectionObjVtbl = {
692 DispatchEx_QueryInterface,
695 DispatchEx_GetTypeInfoCount,
696 DispatchEx_GetTypeInfo,
697 DispatchEx_GetIDsOfNames,
699 collectionObj_GetDispID,
700 collectionObj_InvokeEx,
701 DispatchEx_DeleteMemberByName,
702 DispatchEx_DeleteMemberByDispID,
703 DispatchEx_GetMemberProperties,
704 DispatchEx_GetMemberName,
705 DispatchEx_GetNextDispID,
706 DispatchEx_GetNameSpaceParent
709 static IDispatchEx collectionObj = { &collectionObjVtbl };
711 static ULONG refobj_ref;
713 static ULONG WINAPI RefObj_AddRef(IDispatchEx *iface)
718 static ULONG WINAPI RefObj_Release(IDispatchEx *iface)
723 static IDispatchExVtbl RefObjVtbl = {
724 DispatchEx_QueryInterface,
727 DispatchEx_GetTypeInfoCount,
728 DispatchEx_GetTypeInfo,
729 DispatchEx_GetIDsOfNames,
731 DispatchEx_GetDispID,
733 DispatchEx_DeleteMemberByName,
734 DispatchEx_DeleteMemberByDispID,
735 DispatchEx_GetMemberProperties,
736 DispatchEx_GetMemberName,
737 DispatchEx_GetNextDispID,
738 DispatchEx_GetNameSpaceParent
741 static IDispatchEx RefObj = { &RefObjVtbl };
743 static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
745 if(!strcmp_wa(bstrName, "ok")) {
746 test_grfdex(grfdex, fdexNameCaseInsensitive);
747 *pid = DISPID_GLOBAL_OK;
750 if(!strcmp_wa(bstrName, "trace")) {
751 test_grfdex(grfdex, fdexNameCaseInsensitive);
752 *pid = DISPID_GLOBAL_TRACE;
755 if(!strcmp_wa(bstrName, "reportSuccess")) {
756 CHECK_EXPECT(global_success_d);
757 test_grfdex(grfdex, fdexNameCaseInsensitive);
758 *pid = DISPID_GLOBAL_REPORTSUCCESS;
761 if(!strcmp_wa(bstrName, "getVT")) {
762 test_grfdex(grfdex, fdexNameCaseInsensitive);
763 *pid = DISPID_GLOBAL_GETVT;
766 if(!strcmp_wa(bstrName, "isEnglishLang")) {
767 test_grfdex(grfdex, fdexNameCaseInsensitive);
768 *pid = DISPID_GLOBAL_ISENGLANG;
771 if(!strcmp_wa(bstrName, "testObj")) {
772 test_grfdex(grfdex, fdexNameCaseInsensitive);
773 *pid = DISPID_GLOBAL_TESTOBJ;
776 if(!strcmp_wa(bstrName, "collectionObj")) {
777 test_grfdex(grfdex, fdexNameCaseInsensitive);
778 *pid = DISPID_GLOBAL_COLLOBJ;
781 if(!strcmp_wa(bstrName, "vbvar")) {
782 CHECK_EXPECT(global_vbvar_d);
783 test_grfdex(grfdex, fdexNameCaseInsensitive);
784 *pid = DISPID_GLOBAL_VBVAR;
787 if(!strcmp_wa(bstrName, "isNullDisp")) {
788 test_grfdex(grfdex, fdexNameCaseInsensitive);
789 *pid = DISPID_GLOBAL_ISNULLDISP;
792 if(!strcmp_wa(bstrName, "testDisp")) {
793 test_grfdex(grfdex, fdexNameCaseInsensitive);
794 *pid = DISPID_GLOBAL_TESTDISP;
797 if(!strcmp_wa(bstrName, "RefObj")) {
798 test_grfdex(grfdex, fdexNameCaseInsensitive);
799 *pid = DISPID_GLOBAL_REFOBJ;
802 if(!strcmp_wa(bstrName, "propargput")) {
803 CHECK_EXPECT(global_propargput_d);
804 test_grfdex(grfdex, fdexNameCaseInsensitive);
805 *pid = DISPID_GLOBAL_PROPARGPUT;
808 if(!strcmp_wa(bstrName, "propargput1")) {
809 CHECK_EXPECT(global_propargput1_d);
810 test_grfdex(grfdex, fdexNameCaseInsensitive);
811 *pid = DISPID_GLOBAL_PROPARGPUT1;
814 if(!strcmp_wa(bstrName, "counter")) {
815 test_grfdex(grfdex, fdexNameCaseInsensitive);
816 *pid = DISPID_GLOBAL_COUNTER;
819 if(!strcmp_wa(bstrName, "doubleAsString")) {
820 test_grfdex(grfdex, fdexNameCaseInsensitive);
821 *pid = DISPID_GLOBAL_DOUBLEASSTRING;
825 if(strict_dispid_check && strcmp_wa(bstrName, "x"))
826 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
827 return DISP_E_UNKNOWNNAME;
830 static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
831 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
834 case DISPID_GLOBAL_OK: {
837 ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
838 ok(pdp != NULL, "pdp == NULL\n");
839 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
840 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
841 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
842 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
843 if(wFlags & INVOKE_PROPERTYGET)
844 ok(pvarRes != NULL, "pvarRes == NULL\n");
846 ok(!pvarRes, "pvarRes != NULL\n");
847 ok(pei != NULL, "pei == NULL\n");
849 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
852 if(V_VT(b) == (VT_BYREF|VT_VARIANT))
855 ok(V_VT(b) == VT_BOOL, "V_VT(b) = %d\n", V_VT(b));
857 ok(V_BOOL(b), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
861 case DISPID_GLOBAL_TRACE:
862 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
863 ok(pdp != NULL, "pdp == NULL\n");
864 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
865 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
866 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
867 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
868 ok(!pvarRes, "pvarRes != NULL\n");
869 ok(pei != NULL, "pei == NULL\n");
871 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
872 if(V_VT(pdp->rgvarg) == VT_BSTR)
873 trace("%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
877 case DISPID_GLOBAL_REPORTSUCCESS:
878 CHECK_EXPECT(global_success_i);
880 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
881 ok(pdp != NULL, "pdp == NULL\n");
882 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
883 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
884 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
885 ok(!pvarRes, "pvarRes != NULL\n");
886 ok(pei != NULL, "pei == NULL\n");
890 case DISPID_GLOBAL_GETVT:
891 ok(pdp != NULL, "pdp == NULL\n");
892 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
893 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
894 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
895 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
896 ok(pvarRes != NULL, "pvarRes == NULL\n");
897 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
898 ok(pei != NULL, "pei == NULL\n");
900 V_VT(pvarRes) = VT_BSTR;
901 V_BSTR(pvarRes) = a2bstr(vt2a(pdp->rgvarg));
904 case DISPID_GLOBAL_ISENGLANG:
905 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
906 ok(pdp != NULL, "pdp == NULL\n");
907 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
908 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
909 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
910 ok(pvarRes != NULL, "pvarRes == NULL\n");
911 ok(pei != NULL, "pei == NULL\n");
913 V_VT(pvarRes) = VT_BOOL;
914 V_BOOL(pvarRes) = is_english ? VARIANT_TRUE : VARIANT_FALSE;
917 case DISPID_GLOBAL_VBVAR:
918 CHECK_EXPECT(global_vbvar_i);
920 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
921 ok(pdp != NULL, "pdp == NULL\n");
922 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
923 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
924 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
925 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
926 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
927 ok(!pvarRes, "pvarRes != NULL\n");
928 ok(pei != NULL, "pei == NULL\n");
930 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
931 ok(V_I2(pdp->rgvarg) == 3, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
934 case DISPID_GLOBAL_TESTOBJ:
935 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
937 ok(pdp != NULL, "pdp == NULL\n");
938 ok(!pdp->rgvarg, "rgvarg != NULL\n");
939 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
940 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
941 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
942 ok(pvarRes != NULL, "pvarRes == NULL\n");
943 ok(pei != NULL, "pei == NULL\n");
945 V_VT(pvarRes) = VT_DISPATCH;
946 V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
949 case DISPID_GLOBAL_COLLOBJ:
950 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
952 ok(pdp != NULL, "pdp == NULL\n");
953 ok(!pdp->rgvarg, "rgvarg != NULL\n");
954 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
955 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
956 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
957 ok(pvarRes != NULL, "pvarRes == NULL\n");
958 ok(pei != NULL, "pei == NULL\n");
960 V_VT(pvarRes) = VT_DISPATCH;
961 V_DISPATCH(pvarRes) = (IDispatch*)&collectionObj;
964 case DISPID_GLOBAL_REFOBJ:
965 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
967 ok(pdp != NULL, "pdp == NULL\n");
968 ok(!pdp->rgvarg, "rgvarg == NULL\n");
969 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
970 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
971 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
972 ok(pvarRes != NULL, "pvarRes == NULL\n");
973 ok(pei != NULL, "pei == NULL\n");
975 IDispatchEx_AddRef(&RefObj);
976 V_VT(pvarRes) = VT_DISPATCH;
977 V_DISPATCH(pvarRes) = (IDispatch*)&RefObj;
980 case DISPID_GLOBAL_ISNULLDISP: {
983 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
984 ok(pdp != NULL, "pdp == NULL\n");
985 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
986 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
987 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
988 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
989 ok(pvarRes != NULL, "pvarRes == NULL\n");
990 ok(pei != NULL, "pei == NULL\n");
993 if(V_VT(v) == (VT_VARIANT|VT_BYREF))
996 ok(V_VT(v) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
997 V_VT(pvarRes) = VT_BOOL;
998 V_BOOL(pvarRes) = V_DISPATCH(v) ? VARIANT_FALSE : VARIANT_TRUE;
1002 case DISPID_GLOBAL_TESTDISP:
1003 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1004 ok(pdp != NULL, "pdp == NULL\n");
1005 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1006 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1007 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1008 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1009 ok(!pvarRes, "pvarRes != NULL\n");
1010 ok(pei != NULL, "pei == NULL\n");
1012 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1013 test_disp(V_DISPATCH(pdp->rgvarg));
1016 case DISPID_GLOBAL_PROPARGPUT:
1017 CHECK_EXPECT(global_propargput_i);
1019 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1020 ok(pdp != NULL, "pdp == NULL\n");
1021 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1022 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1023 ok(pdp->cArgs == 3, "cArgs = %d\n", pdp->cArgs);
1024 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1025 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1026 ok(!pvarRes, "pvarRes != NULL\n");
1027 ok(pei != NULL, "pei == NULL\n");
1029 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1030 ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1032 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1033 ok(V_I2(pdp->rgvarg+1) == 2, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1035 ok(V_VT(pdp->rgvarg+2) == VT_I2, "V_VT(psp->rgvargs+2) = %d\n", V_VT(pdp->rgvarg+2));
1036 ok(V_I2(pdp->rgvarg+2) == 1, "V_I2(psp->rgvargs+2) = %d\n", V_I2(pdp->rgvarg+2));
1039 case DISPID_GLOBAL_PROPARGPUT1:
1040 CHECK_EXPECT(global_propargput1_i);
1042 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1043 ok(pdp != NULL, "pdp == NULL\n");
1044 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1045 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1046 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1047 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1048 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1049 ok(!pvarRes, "pvarRes != NULL\n");
1050 ok(pei != NULL, "pei == NULL\n");
1052 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1053 ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1055 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1056 ok(V_I2(pdp->rgvarg+1) == 1, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1060 case DISPID_GLOBAL_COUNTER:
1061 ok(pdp != NULL, "pdp == NULL\n");
1062 todo_wine ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1063 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1064 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1065 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1066 ok(pvarRes != NULL, "pvarRes == NULL\n");
1067 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1068 ok(pei != NULL, "pei == NULL\n");
1070 V_VT(pvarRes) = VT_I2;
1071 V_I2(pvarRes) = test_counter++;
1074 case DISPID_GLOBAL_DOUBLEASSTRING:
1075 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1076 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1077 ok(V_VT(pdp->rgvarg) == VT_R8, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1078 ok(pvarRes != NULL, "pvarRes == NULL\n");
1080 V_VT(pvarRes) = VT_BSTR;
1081 return VarBstrFromR8(V_R8(pdp->rgvarg), 0, 0, &V_BSTR(pvarRes));
1084 ok(0, "unexpected call %d\n", id);
1085 return DISP_E_MEMBERNOTFOUND;
1088 static IDispatchExVtbl GlobalVtbl = {
1089 DispatchEx_QueryInterface,
1092 DispatchEx_GetTypeInfoCount,
1093 DispatchEx_GetTypeInfo,
1094 DispatchEx_GetIDsOfNames,
1098 DispatchEx_DeleteMemberByName,
1099 DispatchEx_DeleteMemberByDispID,
1100 DispatchEx_GetMemberProperties,
1101 DispatchEx_GetMemberName,
1102 DispatchEx_GetNextDispID,
1103 DispatchEx_GetNameSpaceParent
1106 static IDispatchEx Global = { &GlobalVtbl };
1108 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
1112 if(IsEqualGUID(&IID_IUnknown, riid))
1114 else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
1117 return E_NOINTERFACE;
1119 IUnknown_AddRef((IUnknown*)*ppv);
1123 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
1128 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
1133 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
1135 *plcid = GetUserDefaultLCID();
1139 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
1140 DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
1142 ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
1143 ok(!ppti, "ppti != NULL\n");
1145 if(strcmp_wa(pstrName, "test"))
1146 ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName));
1148 *ppiunkItem = (IUnknown*)&Global;
1152 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
1157 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
1158 const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
1163 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
1168 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
1173 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
1178 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
1183 #undef ACTSCPSITE_THIS
1185 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
1186 ActiveScriptSite_QueryInterface,
1187 ActiveScriptSite_AddRef,
1188 ActiveScriptSite_Release,
1189 ActiveScriptSite_GetLCID,
1190 ActiveScriptSite_GetItemInfo,
1191 ActiveScriptSite_GetDocVersionString,
1192 ActiveScriptSite_OnScriptTerminate,
1193 ActiveScriptSite_OnStateChange,
1194 ActiveScriptSite_OnScriptError,
1195 ActiveScriptSite_OnEnterScript,
1196 ActiveScriptSite_OnLeaveScript
1199 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
1201 static IActiveScript *create_script(void)
1203 IActiveScript *script;
1206 hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1207 &IID_IActiveScript, (void**)&script);
1208 ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
1213 static HRESULT parse_script(DWORD flags, BSTR script_str)
1215 IActiveScriptParse *parser;
1216 IActiveScript *engine;
1217 IDispatch *script_disp;
1221 engine = create_script();
1225 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1226 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1229 IActiveScript_Release(engine);
1233 hres = IActiveScriptParse64_InitNew(parser);
1234 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1236 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1237 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1239 hres = IActiveScript_AddNamedItem(engine, testW,
1240 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
1241 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1243 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1244 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1246 hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
1247 ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
1248 ok(script_disp != NULL, "script_disp == NULL\n");
1249 ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
1253 hres = IActiveScriptParse64_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1255 IActiveScript_Close(engine);
1257 IDispatch_Release(script_disp);
1258 IActiveScript_Release(engine);
1260 ref = IUnknown_Release(parser);
1261 ok(!ref, "ref=%d\n", ref);
1265 static void parse_script_af(DWORD flags, const char *src)
1271 hres = parse_script(flags, tmp);
1273 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1276 static void parse_script_a(const char *src)
1278 parse_script_af(SCRIPTITEM_GLOBALMEMBERS, src);
1281 static void test_gc(void)
1283 IActiveScriptParse *parser;
1284 IActiveScript *engine;
1288 strict_dispid_check = FALSE;
1290 engine = create_script();
1294 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1295 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1297 hres = IActiveScriptParse64_InitNew(parser);
1298 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1300 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1301 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1303 hres = IActiveScript_AddNamedItem(engine, testW,
1304 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1305 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1307 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1308 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1313 " Public Sub Class_Terminate\n"
1314 " Call reportSuccess()\n"
1320 "set x = nothing\n");
1322 hres = IActiveScriptParse64_ParseScriptText(parser, src, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1323 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1326 SET_EXPECT(global_success_d);
1327 SET_EXPECT(global_success_i);
1328 IActiveScript_Close(engine);
1329 CHECK_CALLED(global_success_d);
1330 CHECK_CALLED(global_success_i);
1332 IActiveScript_Release(engine);
1333 IUnknown_Release(parser);
1336 static HRESULT test_global_vars_ref(BOOL use_close)
1338 IActiveScriptParse *parser;
1339 IActiveScript *engine;
1344 engine = create_script();
1348 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1349 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1352 IActiveScript_Release(engine);
1356 hres = IActiveScriptParse64_InitNew(parser);
1357 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1359 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1360 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1362 hres = IActiveScript_AddNamedItem(engine, testW, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1363 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1365 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1366 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1370 script_str = a2bstr("Dim x\nset x = RefObj\n");
1371 hres = IActiveScriptParse64_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1372 SysFreeString(script_str);
1374 ok(refobj_ref, "refobj_ref = 0\n");
1377 hres = IActiveScript_Close(engine);
1378 ok(hres == S_OK, "Close failed: %08x\n", hres);
1380 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_UNINITIALIZED);
1381 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1384 ok(!refobj_ref, "refobj_ref = %d\n", refobj_ref);
1386 IActiveScript_Release(engine);
1388 ref = IUnknown_Release(parser);
1389 ok(!ref, "ref=%d\n", ref);
1393 static BSTR get_script_from_file(const char *filename)
1397 const char *file_map;
1400 file = CreateFileA(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
1401 if(file == INVALID_HANDLE_VALUE) {
1402 trace("Could not open file: %u\n", GetLastError());
1406 size = GetFileSize(file, NULL);
1408 map = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL);
1410 if(map == INVALID_HANDLE_VALUE) {
1411 trace("Could not create file mapping: %u\n", GetLastError());
1415 file_map = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
1418 trace("MapViewOfFile failed: %u\n", GetLastError());
1422 len = MultiByteToWideChar(CP_ACP, 0, file_map, size, NULL, 0);
1423 ret = SysAllocStringLen(NULL, len);
1424 MultiByteToWideChar(CP_ACP, 0, file_map, size, ret, len);
1426 UnmapViewOfFile(file_map);
1431 static void run_from_file(const char *filename)
1436 script_str = get_script_from_file(filename);
1440 strict_dispid_check = FALSE;
1441 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str);
1442 SysFreeString(script_str);
1443 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1446 static void run_from_res(const char *name)
1454 strict_dispid_check = FALSE;
1457 src = FindResourceA(NULL, name, (LPCSTR)40);
1458 ok(src != NULL, "Could not find resource %s\n", name);
1460 size = SizeofResource(NULL, src);
1461 data = LoadResource(NULL, src);
1463 len = MultiByteToWideChar(CP_ACP, 0, data, size, NULL, 0);
1464 str = SysAllocStringLen(NULL, len);
1465 MultiByteToWideChar(CP_ACP, 0, data, size, str, len);
1467 SET_EXPECT(global_success_d);
1468 SET_EXPECT(global_success_i);
1469 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str);
1470 CHECK_CALLED(global_success_d);
1471 CHECK_CALLED(global_success_i);
1473 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1477 static void run_tests(void)
1479 strict_dispid_check = TRUE;
1482 parse_script_a("' empty ;");
1484 SET_EXPECT(global_success_d);
1485 SET_EXPECT(global_success_i);
1486 parse_script_a("reportSuccess");
1487 CHECK_CALLED(global_success_d);
1488 CHECK_CALLED(global_success_i);
1490 SET_EXPECT(global_success_d);
1491 SET_EXPECT(global_success_i);
1492 parse_script_a("reportSuccess()");
1493 CHECK_CALLED(global_success_d);
1494 CHECK_CALLED(global_success_i);
1496 SET_EXPECT(global_success_d);
1497 SET_EXPECT(global_success_i);
1498 parse_script_a("Call reportSuccess");
1499 CHECK_CALLED(global_success_d);
1500 CHECK_CALLED(global_success_i);
1502 SET_EXPECT(global_success_d);
1503 SET_EXPECT(global_success_i);
1504 parse_script_a("test.reportSuccess()");
1505 CHECK_CALLED(global_success_d);
1506 CHECK_CALLED(global_success_i);
1508 SET_EXPECT(global_vbvar_d);
1509 SET_EXPECT(global_vbvar_i);
1510 parse_script_a("Option Explicit\nvbvar = 3");
1511 CHECK_CALLED(global_vbvar_d);
1512 CHECK_CALLED(global_vbvar_i);
1514 SET_EXPECT(global_vbvar_d);
1515 SET_EXPECT(global_vbvar_i);
1516 parse_script_a("Option Explicit\nvbvar() = 3");
1517 CHECK_CALLED(global_vbvar_d);
1518 CHECK_CALLED(global_vbvar_i);
1520 SET_EXPECT(testobj_propget_d);
1521 SET_EXPECT(testobj_propget_i);
1522 parse_script_a("dim x\nx = testObj.propget");
1523 CHECK_CALLED(testobj_propget_d);
1524 CHECK_CALLED(testobj_propget_i);
1526 SET_EXPECT(testobj_propput_d);
1527 SET_EXPECT(testobj_propput_i);
1528 parse_script_a("testObj.propput = 1");
1529 CHECK_CALLED(testobj_propput_d);
1530 CHECK_CALLED(testobj_propput_i);
1532 SET_EXPECT(global_propargput_d);
1533 SET_EXPECT(global_propargput_i);
1534 parse_script_a("propargput(counter(), counter()) = counter()");
1535 CHECK_CALLED(global_propargput_d);
1536 CHECK_CALLED(global_propargput_i);
1538 SET_EXPECT(global_propargput_d);
1539 SET_EXPECT(global_propargput_i);
1540 parse_script_a("test.propargput(counter(), counter()) = counter()");
1541 CHECK_CALLED(global_propargput_d);
1542 CHECK_CALLED(global_propargput_i);
1544 SET_EXPECT(global_propargput1_d);
1545 SET_EXPECT(global_propargput1_i);
1546 parse_script_a("propargput1 (counter()) = counter()");
1547 CHECK_CALLED(global_propargput1_d);
1548 CHECK_CALLED(global_propargput1_i);
1550 SET_EXPECT(global_propargput1_d);
1551 SET_EXPECT(global_propargput1_i);
1552 parse_script_a("test.propargput1(counter()) = counter()");
1553 CHECK_CALLED(global_propargput1_d);
1554 CHECK_CALLED(global_propargput1_i);
1557 SET_EXPECT(collectionobj_newenum_i);
1559 parse_script_a("for each x in collectionObj\nnext");
1560 CHECK_CALLED(collectionobj_newenum_i);
1562 ok(next_cnt == 4, "next_cnt = %d\n", next_cnt);
1564 parse_script_a("x = 1\n Call ok(x = 1, \"x = \" & x)");
1566 parse_script_a("x = _ \n3");
1568 test_global_vars_ref(TRUE);
1569 test_global_vars_ref(FALSE);
1571 strict_dispid_check = FALSE;
1573 parse_script_a("Sub testsub\n"
1575 "Call ok(x = 1, \"x = \" & x)\n"
1579 run_from_res("lang.vbs");
1580 run_from_res("api.vbs");
1585 static BOOL check_vbscript(void)
1587 IActiveScript *vbscript;
1590 hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1591 &IID_IActiveScript, (void**)&vbscript);
1593 IActiveScript_Release(vbscript);
1595 return hres == S_OK;
1603 is_english = is_lang_english();
1605 skip("Skipping some tests in non-English UIs\n");
1607 argc = winetest_get_mainargs(&argv);
1611 if(!check_vbscript()) {
1612 win_skip("Broken engine, probably too old\n");
1613 }else if(argc > 2) {
1614 run_from_file(argv[2]);