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
39 #define IActiveScriptParse_QueryInterface IActiveScriptParse32_QueryInterface
40 #define IActiveScriptParse_Release IActiveScriptParse32_Release
41 #define IActiveScriptParse_InitNew IActiveScriptParse32_InitNew
42 #define IActiveScriptParse_ParseScriptText IActiveScriptParse32_ParseScriptText
46 extern const CLSID CLSID_VBScript;
48 #define DEFINE_EXPECT(func) \
49 static BOOL expect_ ## func = FALSE, called_ ## func = FALSE
51 #define SET_EXPECT(func) \
52 expect_ ## func = TRUE
54 #define CHECK_EXPECT2(func) \
56 ok(expect_ ##func, "unexpected call " #func "\n"); \
57 called_ ## func = TRUE; \
60 #define CHECK_EXPECT(func) \
62 CHECK_EXPECT2(func); \
63 expect_ ## func = FALSE; \
66 #define CHECK_CALLED(func) \
68 ok(called_ ## func, "expected " #func "\n"); \
69 expect_ ## func = called_ ## func = FALSE; \
72 DEFINE_EXPECT(global_success_d);
73 DEFINE_EXPECT(global_success_i);
74 DEFINE_EXPECT(global_vbvar_d);
75 DEFINE_EXPECT(global_vbvar_i);
76 DEFINE_EXPECT(testobj_propget_d);
77 DEFINE_EXPECT(testobj_propget_i);
78 DEFINE_EXPECT(testobj_propput_d);
79 DEFINE_EXPECT(testobj_propput_i);
80 DEFINE_EXPECT(global_propargput_d);
81 DEFINE_EXPECT(global_propargput_i);
82 DEFINE_EXPECT(global_propargput1_d);
83 DEFINE_EXPECT(global_propargput1_i);
84 DEFINE_EXPECT(collectionobj_newenum_i);
87 #define DISPID_GLOBAL_REPORTSUCCESS 1000
88 #define DISPID_GLOBAL_TRACE 1001
89 #define DISPID_GLOBAL_OK 1002
90 #define DISPID_GLOBAL_GETVT 1003
91 #define DISPID_GLOBAL_ISENGLANG 1004
92 #define DISPID_GLOBAL_VBVAR 1005
93 #define DISPID_GLOBAL_TESTOBJ 1006
94 #define DISPID_GLOBAL_ISNULLDISP 1007
95 #define DISPID_GLOBAL_TESTDISP 1008
96 #define DISPID_GLOBAL_REFOBJ 1009
97 #define DISPID_GLOBAL_COUNTER 1010
98 #define DISPID_GLOBAL_PROPARGPUT 1011
99 #define DISPID_GLOBAL_PROPARGPUT1 1012
100 #define DISPID_GLOBAL_COLLOBJ 1013
101 #define DISPID_GLOBAL_DOUBLEASSTRING 1014
103 #define DISPID_TESTOBJ_PROPGET 2000
104 #define DISPID_TESTOBJ_PROPPUT 2001
106 #define DISPID_COLLOBJ_RESET 3000
108 static const WCHAR testW[] = {'t','e','s','t',0};
110 static BOOL strict_dispid_check, is_english;
111 static const char *test_name = "(null)";
112 static int test_counter;
114 static BSTR a2bstr(const char *str)
119 len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0);
120 ret = SysAllocStringLen(NULL, len-1);
121 MultiByteToWideChar(CP_ACP, 0, str, -1, ret, len);
126 static int strcmp_wa(LPCWSTR strw, const char *stra)
129 WideCharToMultiByte(CP_ACP, 0, strw, -1, buf, sizeof(buf), 0, 0);
130 return lstrcmpA(buf, stra);
133 static const char *vt2a(VARIANT *v)
135 if(V_VT(v) == (VT_BYREF|VT_VARIANT)) {
137 sprintf(buf, "%s*", vt2a(V_BYREF(v)));
155 return "VT_DISPATCH";
158 case VT_ARRAY|VT_VARIANT:
159 return "VT_ARRAY|VT_VARIANT";
161 ok(0, "unknown vt %d\n", V_VT(v));
166 /* Returns true if the user interface is in English. Note that this does not
167 * presume of the formatting of dates, numbers, etc.
169 static BOOL is_lang_english(void)
171 static HMODULE hkernel32 = NULL;
172 static LANGID (WINAPI *pGetThreadUILanguage)(void) = NULL;
173 static LANGID (WINAPI *pGetUserDefaultUILanguage)(void) = NULL;
177 hkernel32 = GetModuleHandleA("kernel32.dll");
178 pGetThreadUILanguage = (void*)GetProcAddress(hkernel32, "GetThreadUILanguage");
179 pGetUserDefaultUILanguage = (void*)GetProcAddress(hkernel32, "GetUserDefaultUILanguage");
181 if (pGetThreadUILanguage)
182 return PRIMARYLANGID(pGetThreadUILanguage()) == LANG_ENGLISH;
183 if (pGetUserDefaultUILanguage)
184 return PRIMARYLANGID(pGetUserDefaultUILanguage()) == LANG_ENGLISH;
186 return PRIMARYLANGID(GetUserDefaultLangID()) == LANG_ENGLISH;
189 static void test_disp(IDispatch *disp)
191 DISPID id, public_prop_id, public_prop2_id, public_func_id, public_sub_id, defvalget_id;
192 DISPID named_args[5] = {DISPID_PROPERTYPUT};
194 DISPPARAMS dp = {args, named_args};
200 hres = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
201 ok(hres == S_OK, "Could not get IDispatchEx iface: %08x\n", hres);
203 str = a2bstr("publicProp");
204 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop_id);
206 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
208 str = a2bstr("PUBLICPROP");
209 hres = IDispatchEx_GetDispID(dispex, str, 0, &id);
211 ok(hres == S_OK, "GetDispID(PUBLICPROP) failed: %08x\n", hres);
212 ok(public_prop_id == id, "id = %d\n", public_prop_id);
214 str = a2bstr("publicPROP2");
215 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_prop2_id);
217 ok(hres == S_OK, "GetDispID(publicProp2) failed: %08x\n", hres);
219 str = a2bstr("defValGet");
220 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &defvalget_id);
222 ok(hres == S_OK, "GetDispID(defValGet) failed: %08x\n", hres);
223 ok(defvalget_id == DISPID_VALUE, "id = %d\n", defvalget_id);
225 str = a2bstr("privateProp");
226 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
228 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
229 ok(id == -1, "id = %d\n", id);
231 str = a2bstr("class_initialize");
232 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
234 ok(hres == S_OK, "GetDispID(publicProp2) failed: %08x\n", hres);
236 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
237 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
238 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
240 V_VT(args) = VT_BOOL;
241 V_BOOL(args) = VARIANT_TRUE;
242 dp.cArgs = dp.cNamedArgs = 1;
244 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, &v, &ei, NULL);
245 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
246 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
248 dp.cArgs = dp.cNamedArgs = 0;
249 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
250 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
251 ok(V_VT(&v) == VT_BOOL, "V_VT(v) = %d\n", V_VT(&v));
252 ok(V_BOOL(&v), "V_BOOL(v) = %x\n", V_BOOL(&v));
255 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
256 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
257 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
259 V_VT(args) = VT_BOOL;
260 V_BOOL(args) = VARIANT_FALSE;
263 hres = IDispatchEx_InvokeEx(dispex, public_prop_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
264 ok(hres == DISP_E_PARAMNOTOPTIONAL, "InvokeEx failed: %08x, expected DISP_E_PARAMNOTOPTIONAL\n", hres);
266 str = a2bstr("publicFunction");
267 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_func_id);
269 ok(hres == S_OK, "GetDispID(publicFunction) failed: %08x\n", hres);
270 ok(public_func_id != -1, "public_func_id = -1\n");
272 str = a2bstr("publicSub");
273 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &public_sub_id);
275 ok(hres == S_OK, "GetDispID(publicSub) failed: %08x\n", hres);
276 ok(public_sub_id != -1, "public_func_id = -1\n");
278 dp.cArgs = dp.cNamedArgs = 0;
279 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
280 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
281 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
282 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
284 dp.cArgs = dp.cNamedArgs = 0;
285 hres = IDispatchEx_InvokeEx(dispex, public_func_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_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
291 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
292 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
293 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
295 dp.cArgs = dp.cNamedArgs = 0;
296 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
297 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
298 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
300 dp.cArgs = dp.cNamedArgs = 0;
301 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET, &dp, &v, &ei, NULL);
302 ok(hres == DISP_E_MEMBERNOTFOUND, "InvokeEx failed: %08x, expected DISP_E_MEMBERNOTFOUND\n", hres);
303 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
305 dp.cArgs = dp.cNamedArgs = 0;
306 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
307 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
308 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
310 V_VT(args) = VT_BOOL;
311 V_BOOL(args) = VARIANT_TRUE;
312 dp.cArgs = dp.cNamedArgs = 1;
313 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYPUT, &dp, NULL, &ei, NULL);
314 ok(FAILED(hres), "InvokeEx succeeded: %08x\n", hres);
316 dp.cArgs = dp.cNamedArgs = 0;
317 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
318 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
319 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
320 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
322 dp.cArgs = dp.cNamedArgs = 0;
323 hres = IDispatchEx_InvokeEx(dispex, public_func_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
324 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
325 ok(V_VT(&v) == VT_I2, "V_VT(v) = %d\n", V_VT(&v));
326 ok(V_I2(&v) == 4, "V_I2(v) = %d\n", V_I2(&v));
328 dp.cArgs = dp.cNamedArgs = 0;
329 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_PROPERTYGET|DISPATCH_METHOD, &dp, &v, &ei, NULL);
330 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
331 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
333 dp.cArgs = dp.cNamedArgs = 0;
334 hres = IDispatchEx_InvokeEx(dispex, public_sub_id, 0, DISPATCH_METHOD, &dp, &v, &ei, NULL);
335 ok(hres == S_OK, "InvokeEx failed: %08x\n", hres);
336 ok(V_VT(&v) == VT_EMPTY, "V_VT(v) = %d\n", V_VT(&v));
338 str = a2bstr("privateSub");
339 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive, &id);
341 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateSub) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
342 ok(id == -1, "id = %d\n", id);
344 str = a2bstr("dynprop");
345 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseInsensitive|fdexNameEnsure, &id);
346 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
347 ok(id == -1, "id = %d\n", id);
348 hres = IDispatchEx_GetDispID(dispex, str, fdexNameEnsure, &id);
349 ok(hres == DISP_E_UNKNOWNNAME, "GetDispID(privateProp) failed: %08x, expected DISP_E_UNKNOWNNAME\n", hres);
350 ok(id == -1, "id = %d\n", id);
353 str = a2bstr("publicProp");
354 hres = IDispatchEx_GetDispID(dispex, str, 0x80000000|fdexNameCaseInsensitive, &public_prop_id);
356 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
359 str = a2bstr("publicProp");
360 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
362 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
363 ok(id == public_prop_id, "id = %d, expected %d\n", id, public_prop_id);
366 str = a2bstr("publicprop");
367 hres = IDispatchEx_GetDispID(dispex, str, fdexNameCaseSensitive, &id);
369 ok(hres == S_OK, "GetDispID(publicProp) failed: %08x\n", hres);
370 ok(id == public_prop_id, "id = %d, expected %d\n", id, public_prop_id);
372 IDispatchEx_Release(dispex);
375 #define test_grfdex(a,b) _test_grfdex(__LINE__,a,b)
376 static void _test_grfdex(unsigned line, DWORD grfdex, DWORD expect)
378 ok_(__FILE__,line)(grfdex == expect, "grfdex = %x, expected %x\n", grfdex, expect);
381 static const char *debugstr_guid(REFIID riid)
385 sprintf(buf, "{%08X-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
386 riid->Data1, riid->Data2, riid->Data3, riid->Data4[0],
387 riid->Data4[1], riid->Data4[2], riid->Data4[3], riid->Data4[4],
388 riid->Data4[5], riid->Data4[6], riid->Data4[7]);
393 static IDispatchEx enumDisp;
395 static HRESULT WINAPI EnumVARIANT_QueryInterface(IEnumVARIANT *iface, REFIID riid, void **ppv)
397 if(IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_IEnumVARIANT)) {
402 if(IsEqualGUID(riid, &IID_IDispatch)) {
407 ok(0, "unexpected call %s\n", debugstr_guid(riid));
408 return E_NOINTERFACE;
411 static ULONG WINAPI EnumVARIANT_AddRef(IEnumVARIANT *iface)
416 static ULONG WINAPI EnumVARIANT_Release(IEnumVARIANT *iface)
421 static unsigned next_cnt;
423 static HRESULT WINAPI EnumVARIANT_Next(IEnumVARIANT *iface, ULONG celt, VARIANT *rgVar, ULONG *pCeltFetched)
425 if(strict_dispid_check)
428 ok(celt == 1, "celt = %d\n", celt);
429 ok(V_VT(rgVar) == VT_EMPTY, "V_VT(rgVar) = %d\n", V_VT(rgVar));
430 ok(!pCeltFetched, "pCeltFetched = %p\n", pCeltFetched);
434 V_I2(rgVar) = next_cnt;
441 static HRESULT WINAPI EnumVARIANT_Skip(IEnumVARIANT *iface, ULONG celt)
443 ok(0, "unexpected call\n");
447 static HRESULT WINAPI EnumVARIANT_Reset(IEnumVARIANT *iface)
449 ok(0, "unexpected call\n");
453 static HRESULT WINAPI EnumVARIANT_Clone(IEnumVARIANT *iface, IEnumVARIANT **ppEnum)
455 ok(0, "unexpected call\n");
459 static const IEnumVARIANTVtbl EnumVARIANTVtbl = {
460 EnumVARIANT_QueryInterface,
469 static IEnumVARIANT enumObj = { &EnumVARIANTVtbl };
471 static HRESULT WINAPI DispatchEx_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
475 if(IsEqualGUID(riid, &IID_IUnknown)
476 || IsEqualGUID(riid, &IID_IDispatch)
477 || IsEqualGUID(riid, &IID_IDispatchEx))
480 trace("QI %s\n", debugstr_guid(riid));
481 return E_NOINTERFACE;
484 IUnknown_AddRef((IUnknown*)*ppv);
488 static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface)
493 static ULONG WINAPI DispatchEx_Release(IDispatchEx *iface)
498 static HRESULT WINAPI DispatchEx_GetTypeInfoCount(IDispatchEx *iface, UINT *pctinfo)
500 ok(0, "unexpected call\n");
504 static HRESULT WINAPI DispatchEx_GetTypeInfo(IDispatchEx *iface, UINT iTInfo,
505 LCID lcid, ITypeInfo **ppTInfo)
507 ok(0, "unexpected call\n");
511 static HRESULT WINAPI DispatchEx_GetIDsOfNames(IDispatchEx *iface, REFIID riid,
512 LPOLESTR *rgszNames, UINT cNames,
513 LCID lcid, DISPID *rgDispId)
515 ok(0, "unexpected call\n");
519 static HRESULT WINAPI DispatchEx_Invoke(IDispatchEx *iface, DISPID dispIdMember,
520 REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams,
521 VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
523 ok(0, "unexpected call\n");
527 static HRESULT WINAPI DispatchEx_DeleteMemberByName(IDispatchEx *iface, BSTR bstrName, DWORD grfdex)
529 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
533 static HRESULT WINAPI DispatchEx_DeleteMemberByDispID(IDispatchEx *iface, DISPID id)
535 ok(0, "unexpected call\n");
539 static HRESULT WINAPI DispatchEx_GetMemberProperties(IDispatchEx *iface, DISPID id, DWORD grfdexFetch, DWORD *pgrfdex)
541 ok(0, "unexpected call\n");
545 static HRESULT WINAPI DispatchEx_GetMemberName(IDispatchEx *iface, DISPID id, BSTR *pbstrName)
547 ok(0, "unexpected call\n");
551 static HRESULT WINAPI DispatchEx_GetNextDispID(IDispatchEx *iface, DWORD grfdex, DISPID id, DISPID *pid)
553 ok(0, "unexpected call\n");
557 static HRESULT WINAPI DispatchEx_GetNameSpaceParent(IDispatchEx *iface, IUnknown **ppunk)
559 ok(0, "unexpected call\n");
563 static HRESULT WINAPI DispatchEx_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
565 ok(0, "unexpected call\n");
569 static HRESULT WINAPI DispatchEx_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
570 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
572 ok(0, "unexpected call %d\n", id);
576 static HRESULT WINAPI testObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
578 if(!strcmp_wa(bstrName, "propget")) {
579 CHECK_EXPECT(testobj_propget_d);
580 test_grfdex(grfdex, fdexNameCaseInsensitive);
581 *pid = DISPID_TESTOBJ_PROPGET;
584 if(!strcmp_wa(bstrName, "propput")) {
585 CHECK_EXPECT(testobj_propput_d);
586 test_grfdex(grfdex, fdexNameCaseInsensitive);
587 *pid = DISPID_TESTOBJ_PROPPUT;
591 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
592 return DISP_E_UNKNOWNNAME;
595 static HRESULT WINAPI testObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
596 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
599 case DISPID_TESTOBJ_PROPGET:
600 CHECK_EXPECT(testobj_propget_i);
602 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
603 ok(pdp != NULL, "pdp == NULL\n");
604 ok(!pdp->rgvarg, "rgvarg == NULL\n");
605 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
606 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
607 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
608 ok(pvarRes != NULL, "pvarRes == NULL\n");
609 ok(pei != NULL, "pei == NULL\n");
611 V_VT(pvarRes) = VT_I2;
614 case DISPID_TESTOBJ_PROPPUT:
615 CHECK_EXPECT(testobj_propput_i);
617 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
618 ok(pdp != NULL, "pdp == NULL\n");
619 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
620 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
621 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
622 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
623 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
624 ok(!pvarRes, "pvarRes != NULL\n");
625 ok(pei != NULL, "pei == NULL\n");
627 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
628 ok(V_I2(pdp->rgvarg) == 1, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
632 ok(0, "unexpected call %d\n", id);
636 static IDispatchExVtbl testObjVtbl = {
637 DispatchEx_QueryInterface,
640 DispatchEx_GetTypeInfoCount,
641 DispatchEx_GetTypeInfo,
642 DispatchEx_GetIDsOfNames,
646 DispatchEx_DeleteMemberByName,
647 DispatchEx_DeleteMemberByDispID,
648 DispatchEx_GetMemberProperties,
649 DispatchEx_GetMemberName,
650 DispatchEx_GetNextDispID,
651 DispatchEx_GetNameSpaceParent
654 static IDispatchEx testObj = { &testObjVtbl };
656 static HRESULT WINAPI enumDisp_QueryInterface(IDispatchEx *iface, REFIID riid, void **ppv)
658 return IEnumVARIANT_QueryInterface(&enumObj, riid, ppv);
661 static IDispatchExVtbl enumDispVtbl = {
662 enumDisp_QueryInterface,
665 DispatchEx_GetTypeInfoCount,
666 DispatchEx_GetTypeInfo,
667 DispatchEx_GetIDsOfNames,
669 DispatchEx_GetDispID,
671 DispatchEx_DeleteMemberByName,
672 DispatchEx_DeleteMemberByDispID,
673 DispatchEx_GetMemberProperties,
674 DispatchEx_GetMemberName,
675 DispatchEx_GetNextDispID,
676 DispatchEx_GetNameSpaceParent
679 static IDispatchEx enumDisp = { &enumDispVtbl };
681 static HRESULT WINAPI collectionObj_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
683 if(!strcmp_wa(bstrName, "reset")) {
684 *pid = DISPID_COLLOBJ_RESET;
688 ok(0, "unexpected call %s\n", wine_dbgstr_w(bstrName));
689 return DISP_E_UNKNOWNNAME;
692 static HRESULT WINAPI collectionObj_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
693 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
697 if(strict_dispid_check)
698 CHECK_EXPECT(collectionobj_newenum_i);
700 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
701 ok(pdp != NULL, "pdp == NULL\n");
702 ok(!pdp->rgvarg, "rgvarg == NULL\n");
703 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
704 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
705 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
706 ok(pvarRes != NULL, "pvarRes == NULL\n");
707 ok(pei != NULL, "pei == NULL\n");
709 V_VT(pvarRes) = VT_UNKNOWN;
710 V_UNKNOWN(pvarRes) = (IUnknown*)&enumObj;
712 case DISPID_COLLOBJ_RESET:
717 ok(0, "unexpected call %d\n", id);
721 static IDispatchExVtbl collectionObjVtbl = {
722 DispatchEx_QueryInterface,
725 DispatchEx_GetTypeInfoCount,
726 DispatchEx_GetTypeInfo,
727 DispatchEx_GetIDsOfNames,
729 collectionObj_GetDispID,
730 collectionObj_InvokeEx,
731 DispatchEx_DeleteMemberByName,
732 DispatchEx_DeleteMemberByDispID,
733 DispatchEx_GetMemberProperties,
734 DispatchEx_GetMemberName,
735 DispatchEx_GetNextDispID,
736 DispatchEx_GetNameSpaceParent
739 static IDispatchEx collectionObj = { &collectionObjVtbl };
741 static ULONG refobj_ref;
743 static ULONG WINAPI RefObj_AddRef(IDispatchEx *iface)
748 static ULONG WINAPI RefObj_Release(IDispatchEx *iface)
753 static IDispatchExVtbl RefObjVtbl = {
754 DispatchEx_QueryInterface,
757 DispatchEx_GetTypeInfoCount,
758 DispatchEx_GetTypeInfo,
759 DispatchEx_GetIDsOfNames,
761 DispatchEx_GetDispID,
763 DispatchEx_DeleteMemberByName,
764 DispatchEx_DeleteMemberByDispID,
765 DispatchEx_GetMemberProperties,
766 DispatchEx_GetMemberName,
767 DispatchEx_GetNextDispID,
768 DispatchEx_GetNameSpaceParent
771 static IDispatchEx RefObj = { &RefObjVtbl };
773 static HRESULT WINAPI Global_GetDispID(IDispatchEx *iface, BSTR bstrName, DWORD grfdex, DISPID *pid)
775 if(!strcmp_wa(bstrName, "ok")) {
776 test_grfdex(grfdex, fdexNameCaseInsensitive);
777 *pid = DISPID_GLOBAL_OK;
780 if(!strcmp_wa(bstrName, "trace")) {
781 test_grfdex(grfdex, fdexNameCaseInsensitive);
782 *pid = DISPID_GLOBAL_TRACE;
785 if(!strcmp_wa(bstrName, "reportSuccess")) {
786 CHECK_EXPECT(global_success_d);
787 test_grfdex(grfdex, fdexNameCaseInsensitive);
788 *pid = DISPID_GLOBAL_REPORTSUCCESS;
791 if(!strcmp_wa(bstrName, "getVT")) {
792 test_grfdex(grfdex, fdexNameCaseInsensitive);
793 *pid = DISPID_GLOBAL_GETVT;
796 if(!strcmp_wa(bstrName, "isEnglishLang")) {
797 test_grfdex(grfdex, fdexNameCaseInsensitive);
798 *pid = DISPID_GLOBAL_ISENGLANG;
801 if(!strcmp_wa(bstrName, "testObj")) {
802 test_grfdex(grfdex, fdexNameCaseInsensitive);
803 *pid = DISPID_GLOBAL_TESTOBJ;
806 if(!strcmp_wa(bstrName, "collectionObj")) {
807 test_grfdex(grfdex, fdexNameCaseInsensitive);
808 *pid = DISPID_GLOBAL_COLLOBJ;
811 if(!strcmp_wa(bstrName, "vbvar")) {
812 CHECK_EXPECT(global_vbvar_d);
813 test_grfdex(grfdex, fdexNameCaseInsensitive);
814 *pid = DISPID_GLOBAL_VBVAR;
817 if(!strcmp_wa(bstrName, "isNullDisp")) {
818 test_grfdex(grfdex, fdexNameCaseInsensitive);
819 *pid = DISPID_GLOBAL_ISNULLDISP;
822 if(!strcmp_wa(bstrName, "testDisp")) {
823 test_grfdex(grfdex, fdexNameCaseInsensitive);
824 *pid = DISPID_GLOBAL_TESTDISP;
827 if(!strcmp_wa(bstrName, "RefObj")) {
828 test_grfdex(grfdex, fdexNameCaseInsensitive);
829 *pid = DISPID_GLOBAL_REFOBJ;
832 if(!strcmp_wa(bstrName, "propargput")) {
833 CHECK_EXPECT(global_propargput_d);
834 test_grfdex(grfdex, fdexNameCaseInsensitive);
835 *pid = DISPID_GLOBAL_PROPARGPUT;
838 if(!strcmp_wa(bstrName, "propargput1")) {
839 CHECK_EXPECT(global_propargput1_d);
840 test_grfdex(grfdex, fdexNameCaseInsensitive);
841 *pid = DISPID_GLOBAL_PROPARGPUT1;
844 if(!strcmp_wa(bstrName, "counter")) {
845 test_grfdex(grfdex, fdexNameCaseInsensitive);
846 *pid = DISPID_GLOBAL_COUNTER;
849 if(!strcmp_wa(bstrName, "doubleAsString")) {
850 test_grfdex(grfdex, fdexNameCaseInsensitive);
851 *pid = DISPID_GLOBAL_DOUBLEASSTRING;
855 if(strict_dispid_check && strcmp_wa(bstrName, "x"))
856 ok(0, "unexpected call %s %x\n", wine_dbgstr_w(bstrName), grfdex);
857 return DISP_E_UNKNOWNNAME;
860 static HRESULT WINAPI Global_InvokeEx(IDispatchEx *iface, DISPID id, LCID lcid, WORD wFlags, DISPPARAMS *pdp,
861 VARIANT *pvarRes, EXCEPINFO *pei, IServiceProvider *pspCaller)
864 case DISPID_GLOBAL_OK: {
867 ok(wFlags == INVOKE_FUNC || wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
868 ok(pdp != NULL, "pdp == NULL\n");
869 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
870 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
871 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
872 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
873 if(wFlags & INVOKE_PROPERTYGET)
874 ok(pvarRes != NULL, "pvarRes == NULL\n");
876 ok(!pvarRes, "pvarRes != NULL\n");
877 ok(pei != NULL, "pei == NULL\n");
879 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
882 if(V_VT(b) == (VT_BYREF|VT_VARIANT))
885 ok(V_VT(b) == VT_BOOL, "V_VT(b) = %d\n", V_VT(b));
887 ok(V_BOOL(b), "%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
891 case DISPID_GLOBAL_TRACE:
892 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
893 ok(pdp != NULL, "pdp == NULL\n");
894 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
895 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
896 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
897 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
898 ok(!pvarRes, "pvarRes != NULL\n");
899 ok(pei != NULL, "pei == NULL\n");
901 ok(V_VT(pdp->rgvarg) == VT_BSTR, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
902 if(V_VT(pdp->rgvarg) == VT_BSTR)
903 trace("%s: %s\n", test_name, wine_dbgstr_w(V_BSTR(pdp->rgvarg)));
907 case DISPID_GLOBAL_REPORTSUCCESS:
908 CHECK_EXPECT(global_success_i);
910 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
911 ok(pdp != NULL, "pdp == NULL\n");
912 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
913 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
914 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
915 ok(!pvarRes, "pvarRes != NULL\n");
916 ok(pei != NULL, "pei == NULL\n");
920 case DISPID_GLOBAL_GETVT:
921 ok(pdp != NULL, "pdp == NULL\n");
922 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
923 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
924 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
925 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
926 ok(pvarRes != NULL, "pvarRes == NULL\n");
927 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
928 ok(pei != NULL, "pei == NULL\n");
930 V_VT(pvarRes) = VT_BSTR;
931 V_BSTR(pvarRes) = a2bstr(vt2a(pdp->rgvarg));
934 case DISPID_GLOBAL_ISENGLANG:
935 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
936 ok(pdp != NULL, "pdp == NULL\n");
937 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
938 ok(pdp->cArgs == 0, "cArgs = %d\n", pdp->cArgs);
939 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
940 ok(pvarRes != NULL, "pvarRes == NULL\n");
941 ok(pei != NULL, "pei == NULL\n");
943 V_VT(pvarRes) = VT_BOOL;
944 V_BOOL(pvarRes) = is_english ? VARIANT_TRUE : VARIANT_FALSE;
947 case DISPID_GLOBAL_VBVAR:
948 CHECK_EXPECT(global_vbvar_i);
950 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
951 ok(pdp != NULL, "pdp == NULL\n");
952 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
953 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
954 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
955 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
956 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
957 ok(!pvarRes, "pvarRes != NULL\n");
958 ok(pei != NULL, "pei == NULL\n");
960 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
961 ok(V_I2(pdp->rgvarg) == 3, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
964 case DISPID_GLOBAL_TESTOBJ:
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 V_VT(pvarRes) = VT_DISPATCH;
976 V_DISPATCH(pvarRes) = (IDispatch*)&testObj;
979 case DISPID_GLOBAL_COLLOBJ:
980 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
982 ok(pdp != NULL, "pdp == NULL\n");
983 ok(!pdp->rgvarg, "rgvarg != NULL\n");
984 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
985 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
986 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
987 ok(pvarRes != NULL, "pvarRes == NULL\n");
988 ok(pei != NULL, "pei == NULL\n");
990 V_VT(pvarRes) = VT_DISPATCH;
991 V_DISPATCH(pvarRes) = (IDispatch*)&collectionObj;
994 case DISPID_GLOBAL_REFOBJ:
995 ok(wFlags == (DISPATCH_PROPERTYGET|DISPATCH_METHOD), "wFlags = %x\n", wFlags);
997 ok(pdp != NULL, "pdp == NULL\n");
998 ok(!pdp->rgvarg, "rgvarg == NULL\n");
999 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1000 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1001 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1002 ok(pvarRes != NULL, "pvarRes == NULL\n");
1003 ok(pei != NULL, "pei == NULL\n");
1005 IDispatchEx_AddRef(&RefObj);
1006 V_VT(pvarRes) = VT_DISPATCH;
1007 V_DISPATCH(pvarRes) = (IDispatch*)&RefObj;
1010 case DISPID_GLOBAL_ISNULLDISP: {
1013 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1014 ok(pdp != NULL, "pdp == NULL\n");
1015 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1016 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1017 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1018 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1019 ok(pvarRes != NULL, "pvarRes == NULL\n");
1020 ok(pei != NULL, "pei == NULL\n");
1023 if(V_VT(v) == (VT_VARIANT|VT_BYREF))
1024 v = V_VARIANTREF(v);
1026 ok(V_VT(v) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1027 V_VT(pvarRes) = VT_BOOL;
1028 V_BOOL(pvarRes) = V_DISPATCH(v) ? VARIANT_FALSE : VARIANT_TRUE;
1032 case DISPID_GLOBAL_TESTDISP:
1033 ok(wFlags == INVOKE_FUNC, "wFlags = %x\n", wFlags);
1034 ok(pdp != NULL, "pdp == NULL\n");
1035 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1036 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1037 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1038 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1039 ok(!pvarRes, "pvarRes != NULL\n");
1040 ok(pei != NULL, "pei == NULL\n");
1042 ok(V_VT(pdp->rgvarg) == VT_DISPATCH, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1043 test_disp(V_DISPATCH(pdp->rgvarg));
1046 case DISPID_GLOBAL_PROPARGPUT:
1047 CHECK_EXPECT(global_propargput_i);
1049 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1050 ok(pdp != NULL, "pdp == NULL\n");
1051 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1052 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1053 ok(pdp->cArgs == 3, "cArgs = %d\n", pdp->cArgs);
1054 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1055 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1056 ok(!pvarRes, "pvarRes != NULL\n");
1057 ok(pei != NULL, "pei == NULL\n");
1059 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1060 ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1062 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1063 ok(V_I2(pdp->rgvarg+1) == 2, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1065 ok(V_VT(pdp->rgvarg+2) == VT_I2, "V_VT(psp->rgvargs+2) = %d\n", V_VT(pdp->rgvarg+2));
1066 ok(V_I2(pdp->rgvarg+2) == 1, "V_I2(psp->rgvargs+2) = %d\n", V_I2(pdp->rgvarg+2));
1069 case DISPID_GLOBAL_PROPARGPUT1:
1070 CHECK_EXPECT(global_propargput1_i);
1072 ok(wFlags == DISPATCH_PROPERTYPUT, "wFlags = %x\n", wFlags);
1073 ok(pdp != NULL, "pdp == NULL\n");
1074 ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1075 ok(pdp->rgdispidNamedArgs != NULL, "rgdispidNamedArgs == NULL\n");
1076 ok(pdp->cArgs == 2, "cArgs = %d\n", pdp->cArgs);
1077 ok(pdp->cNamedArgs == 1, "cNamedArgs = %d\n", pdp->cNamedArgs);
1078 ok(pdp->rgdispidNamedArgs[0] == DISPID_PROPERTYPUT, "pdp->rgdispidNamedArgs[0] = %d\n", pdp->rgdispidNamedArgs[0]);
1079 ok(!pvarRes, "pvarRes != NULL\n");
1080 ok(pei != NULL, "pei == NULL\n");
1082 ok(V_VT(pdp->rgvarg) == VT_I2, "V_VT(psp->rgvargs) = %d\n", V_VT(pdp->rgvarg));
1083 ok(V_I2(pdp->rgvarg) == 0, "V_I2(psp->rgvargs) = %d\n", V_I2(pdp->rgvarg));
1085 ok(V_VT(pdp->rgvarg+1) == VT_I2, "V_VT(psp->rgvargs+1) = %d\n", V_VT(pdp->rgvarg+1));
1086 ok(V_I2(pdp->rgvarg+1) == 1, "V_I2(psp->rgvargs+1) = %d\n", V_I2(pdp->rgvarg+1));
1090 case DISPID_GLOBAL_COUNTER:
1091 ok(pdp != NULL, "pdp == NULL\n");
1092 todo_wine ok(pdp->rgvarg != NULL, "rgvarg == NULL\n");
1093 ok(!pdp->rgdispidNamedArgs, "rgdispidNamedArgs != NULL\n");
1094 ok(!pdp->cArgs, "cArgs = %d\n", pdp->cArgs);
1095 ok(!pdp->cNamedArgs, "cNamedArgs = %d\n", pdp->cNamedArgs);
1096 ok(pvarRes != NULL, "pvarRes == NULL\n");
1097 ok(V_VT(pvarRes) == VT_EMPTY, "V_VT(pvarRes) = %d\n", V_VT(pvarRes));
1098 ok(pei != NULL, "pei == NULL\n");
1100 V_VT(pvarRes) = VT_I2;
1101 V_I2(pvarRes) = test_counter++;
1104 case DISPID_GLOBAL_DOUBLEASSTRING:
1105 ok(wFlags == (INVOKE_FUNC|INVOKE_PROPERTYGET), "wFlags = %x\n", wFlags);
1106 ok(pdp->cArgs == 1, "cArgs = %d\n", pdp->cArgs);
1107 ok(V_VT(pdp->rgvarg) == VT_R8, "V_VT(pdp->rgvarg) = %d\n", V_VT(pdp->rgvarg));
1108 ok(pvarRes != NULL, "pvarRes == NULL\n");
1110 V_VT(pvarRes) = VT_BSTR;
1111 return VarBstrFromR8(V_R8(pdp->rgvarg), 0, 0, &V_BSTR(pvarRes));
1114 ok(0, "unexpected call %d\n", id);
1115 return DISP_E_MEMBERNOTFOUND;
1118 static IDispatchExVtbl GlobalVtbl = {
1119 DispatchEx_QueryInterface,
1122 DispatchEx_GetTypeInfoCount,
1123 DispatchEx_GetTypeInfo,
1124 DispatchEx_GetIDsOfNames,
1128 DispatchEx_DeleteMemberByName,
1129 DispatchEx_DeleteMemberByDispID,
1130 DispatchEx_GetMemberProperties,
1131 DispatchEx_GetMemberName,
1132 DispatchEx_GetNextDispID,
1133 DispatchEx_GetNameSpaceParent
1136 static IDispatchEx Global = { &GlobalVtbl };
1138 static HRESULT WINAPI ActiveScriptSite_QueryInterface(IActiveScriptSite *iface, REFIID riid, void **ppv)
1142 if(IsEqualGUID(&IID_IUnknown, riid))
1144 else if(IsEqualGUID(&IID_IActiveScriptSite, riid))
1147 return E_NOINTERFACE;
1149 IUnknown_AddRef((IUnknown*)*ppv);
1153 static ULONG WINAPI ActiveScriptSite_AddRef(IActiveScriptSite *iface)
1158 static ULONG WINAPI ActiveScriptSite_Release(IActiveScriptSite *iface)
1163 static HRESULT WINAPI ActiveScriptSite_GetLCID(IActiveScriptSite *iface, LCID *plcid)
1165 *plcid = GetUserDefaultLCID();
1169 static HRESULT WINAPI ActiveScriptSite_GetItemInfo(IActiveScriptSite *iface, LPCOLESTR pstrName,
1170 DWORD dwReturnMask, IUnknown **ppiunkItem, ITypeInfo **ppti)
1172 ok(dwReturnMask == SCRIPTINFO_IUNKNOWN, "unexpected dwReturnMask %x\n", dwReturnMask);
1173 ok(!ppti, "ppti != NULL\n");
1175 if(strcmp_wa(pstrName, "test"))
1176 ok(0, "unexpected pstrName %s\n", wine_dbgstr_w(pstrName));
1178 *ppiunkItem = (IUnknown*)&Global;
1182 static HRESULT WINAPI ActiveScriptSite_GetDocVersionString(IActiveScriptSite *iface, BSTR *pbstrVersion)
1187 static HRESULT WINAPI ActiveScriptSite_OnScriptTerminate(IActiveScriptSite *iface,
1188 const VARIANT *pvarResult, const EXCEPINFO *pexcepinfo)
1193 static HRESULT WINAPI ActiveScriptSite_OnStateChange(IActiveScriptSite *iface, SCRIPTSTATE ssScriptState)
1198 static HRESULT WINAPI ActiveScriptSite_OnScriptError(IActiveScriptSite *iface, IActiveScriptError *pscripterror)
1203 static HRESULT WINAPI ActiveScriptSite_OnEnterScript(IActiveScriptSite *iface)
1208 static HRESULT WINAPI ActiveScriptSite_OnLeaveScript(IActiveScriptSite *iface)
1213 #undef ACTSCPSITE_THIS
1215 static const IActiveScriptSiteVtbl ActiveScriptSiteVtbl = {
1216 ActiveScriptSite_QueryInterface,
1217 ActiveScriptSite_AddRef,
1218 ActiveScriptSite_Release,
1219 ActiveScriptSite_GetLCID,
1220 ActiveScriptSite_GetItemInfo,
1221 ActiveScriptSite_GetDocVersionString,
1222 ActiveScriptSite_OnScriptTerminate,
1223 ActiveScriptSite_OnStateChange,
1224 ActiveScriptSite_OnScriptError,
1225 ActiveScriptSite_OnEnterScript,
1226 ActiveScriptSite_OnLeaveScript
1229 static IActiveScriptSite ActiveScriptSite = { &ActiveScriptSiteVtbl };
1231 static IActiveScript *create_script(void)
1233 IActiveScript *script;
1236 hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1237 &IID_IActiveScript, (void**)&script);
1238 ok(hres == S_OK, "CoCreateInstance failed: %08x\n", hres);
1243 static HRESULT parse_script(DWORD flags, BSTR script_str)
1245 IActiveScriptParse *parser;
1246 IActiveScript *engine;
1247 IDispatch *script_disp;
1251 engine = create_script();
1255 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1256 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1259 IActiveScript_Release(engine);
1263 hres = IActiveScriptParse_InitNew(parser);
1264 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1266 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1267 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1269 hres = IActiveScript_AddNamedItem(engine, testW,
1270 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|flags);
1271 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1273 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1274 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1276 hres = IActiveScript_GetScriptDispatch(engine, NULL, &script_disp);
1277 ok(hres == S_OK, "GetScriptDispatch failed: %08x\n", hres);
1278 ok(script_disp != NULL, "script_disp == NULL\n");
1279 ok(script_disp != (IDispatch*)&Global, "script_disp == Global\n");
1283 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1285 IActiveScript_Close(engine);
1287 IDispatch_Release(script_disp);
1288 IActiveScript_Release(engine);
1290 ref = IActiveScriptParse_Release(parser);
1291 ok(!ref, "ref=%d\n", ref);
1295 static void parse_script_af(DWORD flags, const char *src)
1301 hres = parse_script(flags, tmp);
1303 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1306 static void parse_script_a(const char *src)
1308 parse_script_af(SCRIPTITEM_GLOBALMEMBERS, src);
1311 static void test_gc(void)
1313 IActiveScriptParse *parser;
1314 IActiveScript *engine;
1318 strict_dispid_check = FALSE;
1320 engine = create_script();
1324 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1325 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1327 hres = IActiveScriptParse_InitNew(parser);
1328 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1330 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1331 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1333 hres = IActiveScript_AddNamedItem(engine, testW,
1334 SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1335 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1337 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1338 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1343 " Public Sub Class_Terminate\n"
1344 " Call reportSuccess()\n"
1350 "set x = nothing\n");
1352 hres = IActiveScriptParse_ParseScriptText(parser, src, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1353 ok(hres == S_OK, "ParseScriptText failed: %08x\n", hres);
1356 SET_EXPECT(global_success_d);
1357 SET_EXPECT(global_success_i);
1358 IActiveScript_Close(engine);
1359 CHECK_CALLED(global_success_d);
1360 CHECK_CALLED(global_success_i);
1362 IActiveScript_Release(engine);
1363 IActiveScriptParse_Release(parser);
1366 static HRESULT test_global_vars_ref(BOOL use_close)
1368 IActiveScriptParse *parser;
1369 IActiveScript *engine;
1374 engine = create_script();
1378 hres = IActiveScript_QueryInterface(engine, &IID_IActiveScriptParse, (void**)&parser);
1379 ok(hres == S_OK, "Could not get IActiveScriptParse: %08x\n", hres);
1382 IActiveScript_Release(engine);
1386 hres = IActiveScriptParse_InitNew(parser);
1387 ok(hres == S_OK, "InitNew failed: %08x\n", hres);
1389 hres = IActiveScript_SetScriptSite(engine, &ActiveScriptSite);
1390 ok(hres == S_OK, "SetScriptSite failed: %08x\n", hres);
1392 hres = IActiveScript_AddNamedItem(engine, testW, SCRIPTITEM_ISVISIBLE|SCRIPTITEM_ISSOURCE|SCRIPTITEM_GLOBALMEMBERS);
1393 ok(hres == S_OK, "AddNamedItem failed: %08x\n", hres);
1395 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_STARTED);
1396 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1400 script_str = a2bstr("Dim x\nset x = RefObj\n");
1401 hres = IActiveScriptParse_ParseScriptText(parser, script_str, NULL, NULL, NULL, 0, 0, 0, NULL, NULL);
1402 SysFreeString(script_str);
1404 ok(refobj_ref, "refobj_ref = 0\n");
1407 hres = IActiveScript_Close(engine);
1408 ok(hres == S_OK, "Close failed: %08x\n", hres);
1410 hres = IActiveScript_SetScriptState(engine, SCRIPTSTATE_UNINITIALIZED);
1411 ok(hres == S_OK, "SetScriptState(SCRIPTSTATE_STARTED) failed: %08x\n", hres);
1414 ok(!refobj_ref, "refobj_ref = %d\n", refobj_ref);
1416 IActiveScript_Release(engine);
1418 ref = IActiveScriptParse_Release(parser);
1419 ok(!ref, "ref=%d\n", ref);
1423 static BSTR get_script_from_file(const char *filename)
1427 const char *file_map;
1430 file = CreateFileA(filename, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
1431 if(file == INVALID_HANDLE_VALUE) {
1432 trace("Could not open file: %u\n", GetLastError());
1436 size = GetFileSize(file, NULL);
1438 map = CreateFileMapping(file, NULL, PAGE_READONLY, 0, 0, NULL);
1440 if(map == INVALID_HANDLE_VALUE) {
1441 trace("Could not create file mapping: %u\n", GetLastError());
1445 file_map = MapViewOfFile(map, FILE_MAP_READ, 0, 0, 0);
1448 trace("MapViewOfFile failed: %u\n", GetLastError());
1452 len = MultiByteToWideChar(CP_ACP, 0, file_map, size, NULL, 0);
1453 ret = SysAllocStringLen(NULL, len);
1454 MultiByteToWideChar(CP_ACP, 0, file_map, size, ret, len);
1456 UnmapViewOfFile(file_map);
1461 static void run_from_file(const char *filename)
1466 script_str = get_script_from_file(filename);
1470 strict_dispid_check = FALSE;
1471 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, script_str);
1472 SysFreeString(script_str);
1473 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1476 static void run_from_res(const char *name)
1484 strict_dispid_check = FALSE;
1487 src = FindResourceA(NULL, name, (LPCSTR)40);
1488 ok(src != NULL, "Could not find resource %s\n", name);
1490 size = SizeofResource(NULL, src);
1491 data = LoadResource(NULL, src);
1493 len = MultiByteToWideChar(CP_ACP, 0, data, size, NULL, 0);
1494 str = SysAllocStringLen(NULL, len);
1495 MultiByteToWideChar(CP_ACP, 0, data, size, str, len);
1497 SET_EXPECT(global_success_d);
1498 SET_EXPECT(global_success_i);
1499 hres = parse_script(SCRIPTITEM_GLOBALMEMBERS, str);
1500 CHECK_CALLED(global_success_d);
1501 CHECK_CALLED(global_success_i);
1503 ok(hres == S_OK, "parse_script failed: %08x\n", hres);
1507 static void run_tests(void)
1509 strict_dispid_check = TRUE;
1512 parse_script_a("' empty ;");
1514 SET_EXPECT(global_success_d);
1515 SET_EXPECT(global_success_i);
1516 parse_script_a("reportSuccess");
1517 CHECK_CALLED(global_success_d);
1518 CHECK_CALLED(global_success_i);
1520 SET_EXPECT(global_success_d);
1521 SET_EXPECT(global_success_i);
1522 parse_script_a("reportSuccess()");
1523 CHECK_CALLED(global_success_d);
1524 CHECK_CALLED(global_success_i);
1526 SET_EXPECT(global_success_d);
1527 SET_EXPECT(global_success_i);
1528 parse_script_a("Call reportSuccess");
1529 CHECK_CALLED(global_success_d);
1530 CHECK_CALLED(global_success_i);
1532 SET_EXPECT(global_success_d);
1533 SET_EXPECT(global_success_i);
1534 parse_script_a("test.reportSuccess()");
1535 CHECK_CALLED(global_success_d);
1536 CHECK_CALLED(global_success_i);
1538 SET_EXPECT(global_vbvar_d);
1539 SET_EXPECT(global_vbvar_i);
1540 parse_script_a("Option Explicit\nvbvar = 3");
1541 CHECK_CALLED(global_vbvar_d);
1542 CHECK_CALLED(global_vbvar_i);
1544 SET_EXPECT(global_vbvar_d);
1545 SET_EXPECT(global_vbvar_i);
1546 parse_script_a("Option Explicit\nvbvar() = 3");
1547 CHECK_CALLED(global_vbvar_d);
1548 CHECK_CALLED(global_vbvar_i);
1550 SET_EXPECT(testobj_propget_d);
1551 SET_EXPECT(testobj_propget_i);
1552 parse_script_a("dim x\nx = testObj.propget");
1553 CHECK_CALLED(testobj_propget_d);
1554 CHECK_CALLED(testobj_propget_i);
1556 SET_EXPECT(testobj_propput_d);
1557 SET_EXPECT(testobj_propput_i);
1558 parse_script_a("testObj.propput = 1");
1559 CHECK_CALLED(testobj_propput_d);
1560 CHECK_CALLED(testobj_propput_i);
1562 SET_EXPECT(global_propargput_d);
1563 SET_EXPECT(global_propargput_i);
1564 parse_script_a("propargput(counter(), counter()) = counter()");
1565 CHECK_CALLED(global_propargput_d);
1566 CHECK_CALLED(global_propargput_i);
1568 SET_EXPECT(global_propargput_d);
1569 SET_EXPECT(global_propargput_i);
1570 parse_script_a("test.propargput(counter(), counter()) = counter()");
1571 CHECK_CALLED(global_propargput_d);
1572 CHECK_CALLED(global_propargput_i);
1574 SET_EXPECT(global_propargput1_d);
1575 SET_EXPECT(global_propargput1_i);
1576 parse_script_a("propargput1 (counter()) = counter()");
1577 CHECK_CALLED(global_propargput1_d);
1578 CHECK_CALLED(global_propargput1_i);
1580 SET_EXPECT(global_propargput1_d);
1581 SET_EXPECT(global_propargput1_i);
1582 parse_script_a("test.propargput1(counter()) = counter()");
1583 CHECK_CALLED(global_propargput1_d);
1584 CHECK_CALLED(global_propargput1_i);
1587 SET_EXPECT(collectionobj_newenum_i);
1589 parse_script_a("for each x in collectionObj\nnext");
1590 CHECK_CALLED(collectionobj_newenum_i);
1592 ok(next_cnt == 4, "next_cnt = %d\n", next_cnt);
1594 parse_script_a("x = 1\n Call ok(x = 1, \"x = \" & x)");
1596 parse_script_a("x = _ \n3");
1598 test_global_vars_ref(TRUE);
1599 test_global_vars_ref(FALSE);
1601 strict_dispid_check = FALSE;
1603 parse_script_a("Sub testsub\n"
1605 "Call ok(x = 1, \"x = \" & x)\n"
1609 run_from_res("lang.vbs");
1610 run_from_res("api.vbs");
1615 static BOOL check_vbscript(void)
1617 IActiveScript *vbscript;
1620 hres = CoCreateInstance(&CLSID_VBScript, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
1621 &IID_IActiveScript, (void**)&vbscript);
1623 IActiveScript_Release(vbscript);
1625 return hres == S_OK;
1633 is_english = is_lang_english();
1635 skip("Skipping some tests in non-English UIs\n");
1637 argc = winetest_get_mainargs(&argv);
1641 if(!check_vbscript()) {
1642 win_skip("Broken engine, probably too old\n");
1643 }else if(argc > 2) {
1644 run_from_file(argv[2]);