ReactOS 0.4.17-dev-966-gf06eace
wshom.c
Go to the documentation of this file.
1/*
2 * Copyright 2011 Jacek Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#define COBJMACROS
20#define CONST_VTABLE
21
22#include <initguid.h>
23#include <ole2.h>
24#include <dispex.h>
25
26#include "wshom.h"
27#include "wine/test.h"
28
29DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0);
30
31#define check_interface(a, b, c) check_interface_(__LINE__, a, b, c)
32static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOOL supported)
33{
34 IUnknown *iface = iface_ptr;
36 IUnknown *unk;
37
38 expected_hr = supported ? S_OK : E_NOINTERFACE;
39
40 hr = IUnknown_QueryInterface(iface, iid, (void **)&unk);
41 ok_(__FILE__, line)(hr == expected_hr, "Got hr %#lx, expected %#lx.\n", hr, expected_hr);
42 if (SUCCEEDED(hr))
43 IUnknown_Release(unk);
44}
45
46#define test_provideclassinfo(a, b) _test_provideclassinfo((IDispatch*)a, b, __LINE__)
47static void _test_provideclassinfo(IDispatch *disp, const GUID *guid, int line)
48{
50 TYPEATTR *attr;
51 ITypeInfo *ti;
52 HRESULT hr;
53
54 hr = IDispatch_QueryInterface(disp, &IID_IProvideClassInfo, (void **)&classinfo);
55 ok_(__FILE__,line) (hr == S_OK, "Failed to get IProvideClassInfo, %#lx.\n", hr);
56
57 hr = IProvideClassInfo_GetClassInfo(classinfo, &ti);
58 ok_(__FILE__,line) (hr == S_OK, "GetClassInfo() failed, %#lx.\n", hr);
59
60 hr = ITypeInfo_GetTypeAttr(ti, &attr);
61 ok_(__FILE__,line) (hr == S_OK, "GetTypeAttr() failed, %#lx.\n", hr);
62
63 ok_(__FILE__,line) (IsEqualGUID(&attr->guid, guid), "Unexpected typeinfo %s, expected %s\n", wine_dbgstr_guid(&attr->guid),
65
66 IProvideClassInfo_Release(classinfo);
67 ITypeInfo_ReleaseTypeAttr(ti, attr);
68 ITypeInfo_Release(ti);
69}
70
71#define CHECK_BSTR_LENGTH(str) check_bstr_length(str, __LINE__)
72static void check_bstr_length(BSTR str, int line)
73{
74 ok_(__FILE__, line)(SysStringLen(str) == lstrlenW(str), "Unexpected string length %u vs %u.\n",
76}
77
78static void test_wshshell(void)
79{
80 static const WCHAR emptyW[] = L"empty";
81 static const WCHAR cmdexeW[] = L"\\cmd.exe";
83 IWshEnvironment *env;
84 IWshExec *shexec;
85 IWshShell3 *sh3;
86 IDispatchEx *dispex;
87 IWshCollection *coll;
88 IDispatch *disp, *shortcut;
89 IUnknown *shell, *unk;
90 IFolderCollection *folders;
91 IWshShortcut *shcut;
92 ITypeInfo *ti;
93 HRESULT hr;
94 TYPEATTR *tattr;
95 DISPPARAMS dp;
96 EXCEPINFO ei;
98 BSTR str, ret;
99 int retval;
100 DWORD attrs;
101 UINT err;
102
103 hr = CoCreateInstance(&CLSID_WshShell, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
104 &IID_IDispatch, (void**)&disp);
105 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
106
107 hr = IDispatch_QueryInterface(disp, &IID_IWshShell3, (void**)&shell);
108 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
109 test_provideclassinfo(disp, &IID_IWshShell3);
110
111 hr = IDispatch_QueryInterface(disp, &IID_IDispatchEx, (void**)&dispex);
112 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
113 IDispatch_Release(disp);
114
115 hr = IUnknown_QueryInterface(shell, &IID_IWshShell3, (void**)&sh3);
116 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
117
118 hr = IWshShell3_QueryInterface(sh3, &IID_IObjectWithSite, (void**)&unk);
119 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
120
121 hr = IWshShell3_QueryInterface(sh3, &IID_IWshShell, (void**)&unk);
122 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
123 IUnknown_Release(unk);
124
125 hr = IWshShell3_QueryInterface(sh3, &IID_IWshShell2, (void**)&unk);
126 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
127 IUnknown_Release(unk);
128
129 hr = IWshShell3_get_SpecialFolders(sh3, &coll);
130 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
131 test_provideclassinfo(coll, &IID_IWshCollection);
132
133 hr = IWshCollection_QueryInterface(coll, &IID_IFolderCollection, (void**)&folders);
134 ok(hr == E_NOINTERFACE, "Unexpected hr %#lx.\n", hr);
135
136 hr = IWshCollection_QueryInterface(coll, &IID_IDispatch, (void**)&disp);
137 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
138
139 hr = IDispatch_GetTypeInfo(disp, 0, 0, &ti);
140 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
141
142 hr = ITypeInfo_GetTypeAttr(ti, &tattr);
143 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
144 ok(IsEqualIID(&tattr->guid, &IID_IWshCollection), "got wrong type guid\n");
145 ITypeInfo_ReleaseTypeAttr(ti, tattr);
146
147 /* try to call Item() with normal IDispatch procedure */
148 str = SysAllocString(L"Desktop");
149 V_VT(&arg) = VT_BSTR;
150 V_BSTR(&arg) = str;
151 dp.rgvarg = &arg;
152 dp.rgdispidNamedArgs = NULL;
153 dp.cArgs = 1;
154 dp.cNamedArgs = 0;
155 hr = IDispatch_Invoke(disp, DISPID_VALUE, &IID_NULL, 1033, DISPATCH_PROPERTYGET, &dp, &res, &ei, &err);
156 ok(hr == DISP_E_MEMBERNOTFOUND, "Unexpected hr %#lx.\n", hr);
157
158 /* try Item() directly, it returns directory path apparently */
159 V_VT(&res) = VT_EMPTY;
160 hr = IWshCollection_Item(coll, &arg, &res);
161 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
162 ok(V_VT(&res) == VT_BSTR, "got res type %d\n", V_VT(&res));
166
167 /* CreateShortcut() */
168 str = SysAllocString(L"file.lnk");
169 hr = IWshShell3_CreateShortcut(sh3, str, &shortcut);
170 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
172 hr = IDispatch_QueryInterface(shortcut, &IID_IWshShortcut, (void**)&shcut);
173 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
174 test_provideclassinfo(shortcut, &IID_IWshShortcut);
175
176 hr = IWshShortcut_get_Arguments(shcut, NULL);
177 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
178
179 hr = IWshShortcut_get_IconLocation(shcut, NULL);
180 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
181
182 IWshShortcut_Release(shcut);
183 IDispatch_Release(shortcut);
184
185 /* ExpandEnvironmentStrings */
186 hr = IWshShell3_ExpandEnvironmentStrings(sh3, NULL, NULL);
187 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
188
189 str = SysAllocString(L"%PATH%");
190 hr = IWshShell3_ExpandEnvironmentStrings(sh3, str, NULL);
191 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
193
194 V_VT(&arg) = VT_BSTR;
195 V_BSTR(&arg) = SysAllocString(L"SYSTEM");
196 hr = IWshShell3_get_Environment(sh3, &arg, &env);
197 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
199
200 hr = IWshEnvironment_get_Item(env, NULL, NULL);
201 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
202 test_provideclassinfo(env, &IID_IWshEnvironment);
203
204 ret = (BSTR)0x1;
205 hr = IWshEnvironment_get_Item(env, NULL, &ret);
206 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
207 ok(ret && !*ret, "got %p\n", ret);
209
210 /* invalid var name */
211 str = SysAllocString(L"file.lnk");
212 hr = IWshEnvironment_get_Item(env, str, NULL);
213 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
214
215 ret = NULL;
216 hr = IWshEnvironment_get_Item(env, str, &ret);
217 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
218 ok(ret && *ret == 0, "got %s\n", wine_dbgstr_w(ret));
222
223 /* valid name */
224 str = SysAllocString(L"PATH");
225 hr = IWshEnvironment_get_Item(env, str, &ret);
226 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
227 ok(ret && *ret != 0, "got %s\n", wine_dbgstr_w(ret));
231
232 IWshEnvironment_Release(env);
233
234 V_VT(&arg) = VT_I2;
235 V_I2(&arg) = 0;
236 V_VT(&arg2) = VT_ERROR;
238
239 str = SysAllocString(L"notepad.exe");
240 hr = IWshShell3_Run(sh3, str, &arg, &arg2, NULL);
241 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
242
243 retval = 10;
244 hr = IWshShell3_Run(sh3, str, NULL, &arg2, &retval);
245 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
246 ok(retval == 10, "Unexpected retval %d.\n", retval);
247
248 retval = 10;
249 hr = IWshShell3_Run(sh3, str, &arg, NULL, &retval);
250 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
251 ok(retval == 10, "Unexpected retval %d.\n", retval);
252
253 retval = 10;
254 V_VT(&arg2) = VT_ERROR;
255 V_ERROR(&arg2) = 0;
256 hr = IWshShell3_Run(sh3, str, &arg, &arg2, &retval);
257 ok(hr == DISP_E_TYPEMISMATCH, "Unexpected hr %#lx.\n", hr);
258 ok(retval == 10, "Unexpected retval %d.\n", retval);
260
261 V_VT(&arg) = VT_ERROR;
263 V_VT(&arg2) = VT_BOOL;
264 V_BOOL(&arg2) = VARIANT_TRUE;
265
266 retval = 0xdeadbeef;
267 str = SysAllocString(L"cmd.exe /c rd /s /q c:\\nosuchdir");
268 hr = IWshShell3_Run(sh3, str, &arg, &arg2, &retval);
269 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
270 todo_wine ok(retval == ERROR_FILE_NOT_FOUND, "Unexpected retval %d.\n", retval);
272
273 V_VT(&arg) = VT_I2;
274 V_I2(&arg) = 0;
275
276 retval = 0xdeadbeef;
277 str = SysAllocString(L"cmd.exe /c rd /s /q c:\\nosuchdir");
278 hr = IWshShell3_Run(sh3, str, &arg, &arg2, &retval);
279 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
280 todo_wine ok(retval == ERROR_FILE_NOT_FOUND, "Unexpected retval %d.\n", retval);
282
283 retval = 0xdeadbeef;
284 str = SysAllocString(L"\"cmd.exe \" /c rd /s /q c:\\nosuchdir");
285 hr = IWshShell3_Run(sh3, str, &arg, &arg2, &retval);
286 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
287 todo_wine ok(retval == ERROR_FILE_NOT_FOUND, "Unexpected retval %d.\n", retval);
289
291 lstrcatW(path, cmdexeW);
292 attrs = GetFileAttributesW(path);
293 ok(attrs != INVALID_FILE_ATTRIBUTES, "cmd.exe not found\n");
294
295 /* copy cmd.exe to a path with spaces */
297 lstrcatW(path2, L"wshom test dir");
299 lstrcatW(path2, cmdexeW);
301
302 buf[0] = '"';
303 lstrcpyW(buf + 1, path2);
304 buf[lstrlenW(buf)] = '"';
305 lstrcpyW(buf + lstrlenW(path2) + 2, L" /c rd /s /q c:\\nosuchdir");
306
307 retval = 0xdeadbeef;
309 hr = IWshShell3_Run(sh3, str, &arg, &arg2, &retval);
310 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
311 todo_wine ok(retval == ERROR_FILE_NOT_FOUND, "Unexpected retval %d.\n", retval);
313
315 path2[lstrlenW(path2) - lstrlenW(cmdexeW)] = 0;
317
318 /* current directory */
319 if (0) /* crashes on native */
320 hr = IWshShell3_get_CurrentDirectory(sh3, NULL);
321
322 str = NULL;
323 hr = IWshShell3_get_CurrentDirectory(sh3, &str);
324 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
325 ok(str && str[0] != 0, "got empty string\n");
328
329 hr = IWshShell3_put_CurrentDirectory(sh3, NULL);
330 ok(hr == E_INVALIDARG ||
331 broken(hr == HRESULT_FROM_WIN32(ERROR_NOACCESS)), "Unexpected hr %#lx.\n", hr);
332
334 hr = IWshShell3_put_CurrentDirectory(sh3, str);
335 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Unexpected hr %#lx.\n", hr);
337
338 str = SysAllocString(L"deadparrot");
339 hr = IWshShell3_put_CurrentDirectory(sh3, str);
340 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Unexpected hr %#lx.\n", hr);
342
343 /* Exec */
344 hr = IWshShell3_Exec(sh3, NULL, NULL);
345 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
346
347 hr = IWshShell3_Exec(sh3, NULL, &shexec);
348 ok(hr == DISP_E_EXCEPTION, "Unexpected hr %#lx.\n", hr);
349
351 hr = IWshShell3_Exec(sh3, str, &shexec);
352 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Unexpected hr %#lx.\n", hr);
354
355 str = SysAllocString(L"%deadbeaf% /c echo test");
356 hr = IWshShell3_Exec(sh3, str, &shexec);
357 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Unexpected hr %#lx.\n", hr);
359
360 str = SysAllocString(L"%ComSpec% /c echo test");
361 hr = IWshShell3_Exec(sh3, str, &shexec);
362 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
364
365 IWshCollection_Release(coll);
366 IDispatch_Release(disp);
367 IWshShell3_Release(sh3);
368 IUnknown_Release(shell);
369}
370
371/* delete key and all its subkeys */
373{
374 char name[MAX_PATH];
375 DWORD ret;
376
377 while (!(ret = RegEnumKeyA(hkey, 0, name, sizeof(name)))) {
378 HKEY tmp;
379 if (!(ret = RegOpenKeyExA(hkey, name, 0, KEY_ENUMERATE_SUB_KEYS, &tmp))) {
380 ret = delete_key(tmp);
381 RegCloseKey(tmp);
382 }
383 if (ret) break;
384 }
385 if (ret != ERROR_NO_MORE_ITEMS) return ret;
386 RegDeleteKeyA(hkey, "");
387 return 0;
388}
389
390static void test_registry(void)
391{
392 static const WCHAR keypathW[] = L"HKEY_CURRENT_USER\\Software\\Wine\\Test\\";
393 static const WCHAR regszW[] = L"regsz";
395 DWORD dwvalue, type;
396 VARIANT value, v;
397 IWshShell3 *sh3;
398 VARTYPE vartype;
399 LONG bound;
400 HRESULT hr;
401 BSTR name;
402 HKEY root;
403 LONG ret;
404 UINT dim;
405
406 hr = CoCreateInstance(&CLSID_WshShell, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
407 &IID_IWshShell3, (void**)&sh3);
408 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
409
410 /* RegRead() */
411 V_VT(&value) = VT_I2;
412 hr = IWshShell3_RegRead(sh3, NULL, &value);
413 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
414 ok(V_VT(&value) == VT_I2, "got %d\n", V_VT(&value));
415
416 name = SysAllocString(L"HKEY_broken_key");
417 hr = IWshShell3_RegRead(sh3, name, NULL);
418 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
419 V_VT(&value) = VT_I2;
420 hr = IWshShell3_RegRead(sh3, name, &value);
421 ok(hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "Unexpected hr %#lx.\n", hr);
422 ok(V_VT(&value) == VT_I2, "got %d\n", V_VT(&value));
424
425 name = SysAllocString(L"HKEY_CURRENT_USERa");
426 V_VT(&value) = VT_I2;
427 hr = IWshShell3_RegRead(sh3, name, &value);
428 ok(hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "Unexpected hr %#lx.\n", hr);
429 ok(V_VT(&value) == VT_I2, "got %d\n", V_VT(&value));
431
432 ret = RegCreateKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Test", &root);
433 ok(!ret, "Unexpected retval %ld.\n", ret);
434
435 ret = RegSetValueExA(root, "regsz", 0, REG_SZ, (const BYTE*)"foobar", 7);
436 ok(!ret, "Unexpected retval %ld.\n", ret);
437
438 ret = RegSetValueExA(root, "regsz2", 0, REG_SZ, (const BYTE*)"foobar\0f", 9);
439 ok(!ret, "Unexpected retval %ld.\n", ret);
440
441 ret = RegSetValueExA(root, "regmultisz", 0, REG_MULTI_SZ, (const BYTE*)"foo\0bar\0", 9);
442 ok(!ret, "Unexpected retval %ld.\n", ret);
443
444 dwvalue = 10;
445 ret = RegSetValueExA(root, "regdword", 0, REG_DWORD, (const BYTE*)&dwvalue, sizeof(dwvalue));
446 ok(!ret, "Unexpected retval %ld.\n", ret);
447
448 dwvalue = 11;
449 ret = RegSetValueExA(root, "regbinary", 0, REG_BINARY, (const BYTE*)&dwvalue, sizeof(dwvalue));
450 ok(!ret, "Unexpected retval %ld.\n", ret);
451
452 /* REG_SZ */
453 lstrcpyW(pathW, keypathW);
454 lstrcatW(pathW, regszW);
457 hr = IWshShell3_RegRead(sh3, name, &value);
458 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
459 ok(V_VT(&value) == VT_BSTR, "got %d\n", V_VT(&value));
460 ok(!lstrcmpW(V_BSTR(&value), L"foobar"), "got %s\n", wine_dbgstr_w(V_BSTR(&value)));
464
465 /* REG_SZ with embedded NULL */
466 lstrcpyW(pathW, keypathW);
467 lstrcatW(pathW, L"regsz2");
470 hr = IWshShell3_RegRead(sh3, name, &value);
471 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
472 ok(V_VT(&value) == VT_BSTR, "got %d\n", V_VT(&value));
473 ok(SysStringLen(V_BSTR(&value)) == 6, "len %d\n", SysStringLen(V_BSTR(&value)));
477
478 /* REG_DWORD */
479 lstrcpyW(pathW, keypathW);
480 lstrcatW(pathW, L"regdword");
483 hr = IWshShell3_RegRead(sh3, name, &value);
484 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
485 ok(V_VT(&value) == VT_I4, "got %d\n", V_VT(&value));
486 ok(V_I4(&value) == 10, "Unexpected value %ld.\n", V_I4(&value));
488
489 /* REG_BINARY */
490 lstrcpyW(pathW, keypathW);
491 lstrcatW(pathW, L"regbinary");
494 hr = IWshShell3_RegRead(sh3, name, &value);
495 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
496 ok(V_VT(&value) == (VT_ARRAY|VT_VARIANT), "got 0x%x\n", V_VT(&value));
498 ok(dim == 1, "got %u\n", dim);
499
500 hr = SafeArrayGetLBound(V_ARRAY(&value), 1, &bound);
501 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
502 ok(bound == 0, "Unexpected value %lu.\n", bound);
503
504 hr = SafeArrayGetUBound(V_ARRAY(&value), 1, &bound);
505 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
506 ok(bound == 3, "Unexpected value %lu.\n", bound);
507
508 hr = SafeArrayGetVartype(V_ARRAY(&value), &vartype);
509 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
510 ok(vartype == VT_VARIANT, "got %d\n", vartype);
511
512 bound = 0;
513 hr = SafeArrayGetElement(V_ARRAY(&value), &bound, &v);
514 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
515 ok(V_VT(&v) == VT_UI1, "got %d\n", V_VT(&v));
516 ok(V_UI1(&v) == 11, "got %u\n", V_UI1(&v));
517 VariantClear(&v);
520
521 /* REG_MULTI_SZ */
522 lstrcpyW(pathW, keypathW);
523 lstrcatW(pathW, L"regmultisz");
526 hr = IWshShell3_RegRead(sh3, name, &value);
527 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
528 ok(V_VT(&value) == (VT_ARRAY|VT_VARIANT), "got 0x%x\n", V_VT(&value));
530
532 ok(dim == 1, "got %u\n", dim);
533
534 hr = SafeArrayGetLBound(V_ARRAY(&value), 1, &bound);
535 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
536 ok(bound == 0, "Unexpected value %lu.\n", bound);
537
538 hr = SafeArrayGetUBound(V_ARRAY(&value), 1, &bound);
539 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
540 ok(bound == 1, "Unexpected value %lu.\n", bound);
541
542 hr = SafeArrayGetVartype(V_ARRAY(&value), &vartype);
543 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
544 ok(vartype == VT_VARIANT, "got %d\n", vartype);
545
546 bound = 0;
547 hr = SafeArrayGetElement(V_ARRAY(&value), &bound, &v);
548 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
549 ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v));
550 ok(!lstrcmpW(V_BSTR(&v), L"foo"), "got %s\n", wine_dbgstr_w(V_BSTR(&v)));
552 VariantClear(&v);
554
555 name = SysAllocString(L"HKEY_CURRENT_USER\\Software\\Wine\\Test\\regsz1");
556 V_VT(&value) = VT_I2;
557 hr = IWshShell3_RegRead(sh3, name, &value);
558 ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Unexpected hr %#lx.\n", hr);
559 ok(V_VT(&value) == VT_I2, "got %d\n", V_VT(&value));
562
564
565 /* RegWrite() */
566 ret = RegCreateKeyA(HKEY_CURRENT_USER, "Software\\Wine\\Test", &root);
567 ok(!ret, "Unexpected retval %ld.\n", ret);
568
569 hr = IWshShell3_RegWrite(sh3, NULL, NULL, NULL);
570 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
571
572 lstrcpyW(pathW, keypathW);
573 lstrcatW(pathW, regszW);
575
576 hr = IWshShell3_RegWrite(sh3, name, NULL, NULL);
577 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
578
580 hr = IWshShell3_RegWrite(sh3, name, &value, NULL);
581 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
582
583 hr = IWshShell3_RegWrite(sh3, name, &value, &value);
584 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
585
586 /* type is optional */
587 V_VT(&v) = VT_ERROR;
589 hr = IWshShell3_RegWrite(sh3, name, &value, &v);
590 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
591
592 /* default type is REG_SZ */
593 V_VT(&value) = VT_I4;
594 V_I4(&value) = 12;
595 hr = IWshShell3_RegWrite(sh3, name, &value, &v);
596 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
597
598 type = REG_NONE;
599 ret = RegQueryValueExA(root, "regsz", 0, &type, NULL, NULL);
600 ok(!ret, "Unexpected retval %ld.\n", ret);
601 ok(type == REG_SZ, "Unexpected type %ld.\n", type);
602
603 ret = RegDeleteValueA(root, "regsz");
604 ok(!ret, "Unexpected retval %ld.\n", ret);
605 V_VT(&value) = VT_BSTR;
606 V_BSTR(&value) = SysAllocString(regszW);
607 hr = IWshShell3_RegWrite(sh3, name, &value, &v);
608 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
610
611 type = REG_NONE;
612 ret = RegQueryValueExA(root, "regsz", 0, &type, NULL, NULL);
613 ok(!ret, "Unexpected retval %ld.\n", ret);
614 ok(type == REG_SZ, "Unexpected type %ld.\n", type);
615
616 ret = RegDeleteValueA(root, "regsz");
617 ok(!ret, "Unexpected retval %ld.\n", ret);
618 V_VT(&value) = VT_R4;
619 V_R4(&value) = 1.2;
620 hr = IWshShell3_RegWrite(sh3, name, &value, &v);
621 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
623
624 type = REG_NONE;
625 ret = RegQueryValueExA(root, "regsz", 0, &type, NULL, NULL);
626 ok(!ret, "Unexpected retval %ld.\n", ret);
627 ok(type == REG_SZ, "Unexpected type %ld.\n", type);
628
629 ret = RegDeleteValueA(root, "regsz");
630 ok(!ret, "Unexpected retval %ld.\n", ret);
631 V_VT(&value) = VT_R4;
632 V_R4(&value) = 1.2;
633 V_VT(&v) = VT_I2;
634 V_I2(&v) = 1;
635 hr = IWshShell3_RegWrite(sh3, name, &value, &v);
636 ok(hr == E_INVALIDARG, "Unexpected hr %#lx.\n", hr);
638
640
642 IWshShell3_Release(sh3);
643}
644
645static void test_popup(void)
646{
648 IWshShell *sh;
649 int button;
650 HRESULT hr;
651 BSTR text;
652
653 hr = CoCreateInstance(&CLSID_WshShell, NULL, CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER,
654 &IID_IWshShell, (void **)&sh);
655 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
656
657 button = 123;
658 text = SysAllocString(L"Text");
659
660 hr = IWshShell_Popup(sh, NULL, NULL, NULL, NULL, &button);
661 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
662 ok(button == 123, "Unexpected button id %d.\n", button);
663
664 hr = IWshShell_Popup(sh, text, NULL, NULL, NULL, &button);
665 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
666 ok(button == 123, "Unexpected button id %d.\n", button);
667
670
671 V_VT(&timeout) = VT_I2;
672 V_I2(&timeout) = 1;
673
674 V_VT(&type) = VT_I2;
675 V_I2(&type) = 1;
676
677 V_VT(&title) = VT_BSTR;
678 V_BSTR(&title) = NULL;
679
680 hr = IWshShell_Popup(sh, text, &timeout, &optional, &type, &button);
681 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
682 ok(button == -1, "Unexpected button id %d.\n", button);
683
684 hr = IWshShell_Popup(sh, text, &timeout, &title, &optional, &button);
685 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
686 ok(button == -1, "Unexpected button id %d.\n", button);
687
689 IWshShell_Release(sh);
690}
691
692static void test_wshnetwork(void)
693{
694 IDispatch *disp;
695 IWshNetwork2 *nw2;
696 BSTR str, name;
697 HRESULT hr;
698 DWORD len = 0;
699 BOOL ret;
700
701 hr = CoCreateInstance(&CLSID_WshNetwork, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
702 &IID_IDispatch, (void**)&disp);
703 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
704
705 check_interface(disp, &IID_IWshNetwork, TRUE);
706 check_interface(disp, &IID_IWshNetwork2, TRUE);
707 check_interface(disp, &IID_IDispatchEx, FALSE);
709
710 hr = IDispatch_QueryInterface(disp, &IID_IWshNetwork2, (void**)&nw2);
711 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
712
713 hr = IWshNetwork2_get_UserName(nw2, NULL);
714 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
715
716 str = NULL;
717 hr = IWshNetwork2_get_UserName(nw2, &str);
718 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
719 ok(str && str[0] != 0, "got empty string\n");
722 ok(len > 0, "Unexpected len %ld.\n", len);
725 ok(ret == TRUE, "GetUserNameW returned %d.\n", ret);
726 ok(!wcscmp(str, name), "User names do not match %s, %s.\n", debugstr_w(str), debugstr_w(name));
729
730 hr = IWshNetwork2_get_ComputerName(nw2, NULL);
731 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
732
733 str = NULL;
734 hr = IWshNetwork2_get_ComputerName(nw2, &str);
735 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
736 ok(str && str[0] != 0, "Got empty string.\n");
738 len = 0;
740 ok(len > 0, "Unexpected length %ld.\n", len);
743 ok(ret, "GetComputerName() failed %ld.\n", GetLastError());
744 ok(!wcscmp(str, name), "Computer names do not match %s, %s.\n", debugstr_w(str), debugstr_w(name));
747
748 str = NULL;
749 hr = IWshNetwork2_get_UserDomain(nw2, NULL);
750 ok(hr == E_POINTER, "Unexpected hr %#lx.\n", hr);
751 hr = IWshNetwork2_get_UserDomain(nw2, &str);
752 ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
753 ok(!!str, "Unexpected pointer.\n");
755
756 IWshNetwork2_Release(nw2);
757 IDispatch_Release(disp);
758}
759
761{
762 IUnknown *unk;
763 HRESULT hr;
764
766
767 hr = CoCreateInstance(&CLSID_WshShell, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER,
768 &IID_IUnknown, (void**)&unk);
769 if (FAILED(hr))
770 {
771 win_skip("Could not create WshShell object: %#lx.\n", hr);
772 return;
773 }
774 IUnknown_Release(unk);
775
778 test_popup();
780
782}
@ optional
Definition: SystemMenu.c:34
#define REG_SZ
Definition: layer.c:22
#define ok(value,...)
Definition: atltest.h:57
#define broken(x)
Definition: atltest.h:178
#define START_TEST(x)
Definition: atltest.h:75
#define ok_(x1, x2)
Definition: atltest.h:61
void shell(int argc, const char *argv[])
Definition: cmds.c:1231
#define ARRAY_SIZE(A)
Definition: main.h:20
const GUID IID_IUnknown
#define RegCloseKey(hKey)
Definition: registry.h:49
struct _root root
BOOL WINAPI GetComputerNameW(LPWSTR lpBuffer, LPDWORD lpnSize)
Definition: compname.c:446
HRESULT expected_hr
static LPCWSTR LPCWSTR LPCWSTR env
Definition: db.cpp:171
#define E_INVALIDARG
Definition: ddrawi.h:101
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
LONG WINAPI RegCreateKeyA(HKEY hKey, LPCSTR lpSubKey, PHKEY phkResult)
Definition: reg.c:1179
LONG WINAPI RegSetValueExA(HKEY hKey, LPCSTR lpValueName, DWORD Reserved, DWORD dwType, CONST BYTE *lpData, DWORD cbData)
Definition: reg.c:4799
LONG WINAPI RegOpenKeyExA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey, _In_ DWORD ulOptions, _In_ REGSAM samDesired, _Out_ PHKEY phkResult)
Definition: reg.c:3298
LONG WINAPI RegDeleteValueA(HKEY hKey, LPCSTR lpValueName)
Definition: reg.c:2287
LONG WINAPI RegEnumKeyA(HKEY hKey, DWORD dwIndex, LPSTR lpName, DWORD cbName)
Definition: reg.c:2368
LONG WINAPI RegQueryValueExA(_In_ HKEY hkeyorg, _In_ LPCSTR name, _In_ LPDWORD reserved, _Out_opt_ LPDWORD type, _Out_opt_ LPBYTE data, _Inout_opt_ LPDWORD count)
Definition: reg.c:4009
LONG WINAPI RegDeleteKeyA(_In_ HKEY hKey, _In_ LPCSTR lpSubKey)
Definition: reg.c:1224
BOOL WINAPI GetUserNameW(LPWSTR lpszName, LPDWORD lpSize)
Definition: misc.c:291
void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void)
Definition: combase.c:2842
HRESULT WINAPI DECLSPEC_HOTPATCH CoCreateInstance(REFCLSID rclsid, IUnknown *outer, DWORD cls_context, REFIID riid, void **obj)
Definition: combase.c:1685
OLECHAR * BSTR
Definition: compat.h:2293
#define ERROR_NO_MORE_ITEMS
Definition: compat.h:105
#define MAX_PATH
Definition: compat.h:34
unsigned short VARTYPE
Definition: compat.h:2254
#define lstrcpyW
Definition: compat.h:749
@ VT_BSTR
Definition: compat.h:2303
@ VT_R4
Definition: compat.h:2299
@ VT_ERROR
Definition: compat.h:2305
@ VT_ARRAY
Definition: compat.h:2341
@ VT_VARIANT
Definition: compat.h:2307
@ VT_I4
Definition: compat.h:2298
@ VT_BOOL
Definition: compat.h:2306
@ VT_I2
Definition: compat.h:2297
@ VT_EMPTY
Definition: compat.h:2295
@ VT_UI1
Definition: compat.h:2311
#define lstrlenW
Definition: compat.h:750
BOOL WINAPI CopyFileW(IN LPCWSTR lpExistingFileName, IN LPCWSTR lpNewFileName, IN BOOL bFailIfExists)
Definition: copy.c:367
BOOL WINAPI DeleteFileW(IN LPCWSTR lpFileName)
Definition: delete.c:39
BOOL WINAPI CreateDirectoryW(IN LPCWSTR lpPathName, IN LPSECURITY_ATTRIBUTES lpSecurityAttributes)
Definition: dir.c:58
BOOL WINAPI RemoveDirectoryW(IN LPCWSTR lpPathName)
Definition: dir.c:700
DWORD WINAPI GetFileAttributesW(LPCWSTR lpFileName)
Definition: fileinfo.c:636
DWORD WINAPI GetTempPathW(IN DWORD count, OUT LPWSTR path)
Definition: path.c:2098
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2331
int WINAPI lstrcmpW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4152
GUID guid
Definition: version.c:147
const WCHAR * text
Definition: package.c:1826
_ACRTIMP int __cdecl wcscmp(const wchar_t *, const wchar_t *)
Definition: wcs.c:1977
HRESULT WINAPI CoInitialize(LPVOID lpReserved)
Definition: compobj.c:531
HRESULT WINAPI SafeArrayGetUBound(SAFEARRAY *psa, UINT nDim, LONG *plUbound)
Definition: safearray.c:1033
HRESULT WINAPI SafeArrayGetElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData)
Definition: safearray.c:947
UINT WINAPI SafeArrayGetDim(SAFEARRAY *psa)
Definition: safearray.c:1094
HRESULT WINAPI SafeArrayGetLBound(SAFEARRAY *psa, UINT nDim, LONG *plLbound)
Definition: safearray.c:1066
HRESULT WINAPI SafeArrayGetVartype(SAFEARRAY *psa, VARTYPE *pvt)
Definition: safearray.c:1534
return ret
Definition: mutex.c:147
#define L(x)
Definition: resources.c:13
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
const GLdouble * v
Definition: gl.h:2040
GLuint GLuint GLsizei GLenum type
Definition: gl.h:1545
GLuint res
Definition: glext.h:9613
GLuint GLuint GLuint GLuint GLuint GLuint GLuint arg2
Definition: glext.h:9514
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLsizei len
Definition: glext.h:6722
unsigned int UINT
Definition: sysinfo.c:13
static const WCHAR emptyW[]
Definition: navigate.c:40
#define S_OK
Definition: intsafe.h:52
#define SUCCEEDED(hr)
Definition: intsafe.h:50
#define FAILED(hr)
Definition: intsafe.h:51
#define debugstr_w
Definition: kernel32.h:32
#define wine_dbgstr_w
Definition: kernel32.h:34
#define GUID_NULL
Definition: ks.h:106
LPWSTR WINAPI lstrcatW(LPWSTR lpString1, LPCWSTR lpString2)
Definition: lstring.c:274
#define win_skip
Definition: minitest.h:67
#define todo_wine
Definition: minitest.h:80
#define ERROR_FILE_NOT_FOUND
Definition: disk.h:79
DWORD button
Definition: button.c:166
const IID IID_IObjectWithSite
static const WCHAR pathW[]
Definition: path.c:2368
static const WCHAR path2[]
Definition: path.c:29
#define REG_BINARY
Definition: nt_native.h:1499
#define REG_MULTI_SZ
Definition: nt_native.h:1504
#define KEY_ENUMERATE_SUB_KEYS
Definition: nt_native.h:1022
#define REG_NONE
Definition: nt_native.h:1495
BSTR WINAPI SysAllocString(LPCOLESTR str)
Definition: oleaut.c:240
UINT WINAPI SysStringLen(BSTR str)
Definition: oleaut.c:198
void WINAPI DECLSPEC_HOTPATCH SysFreeString(BSTR str)
Definition: oleaut.c:273
BSTR WINAPI SysAllocStringLen(const OLECHAR *str, unsigned int len)
Definition: oleaut.c:341
#define V_ERROR(A)
Definition: oleauto.h:241
#define V_UI1(A)
Definition: oleauto.h:266
#define V_BOOL(A)
Definition: oleauto.h:224
#define V_ARRAY(A)
Definition: oleauto.h:222
#define V_VT(A)
Definition: oleauto.h:211
#define V_BSTR(A)
Definition: oleauto.h:226
#define V_I4(A)
Definition: oleauto.h:247
#define V_R4(A)
Definition: oleauto.h:260
#define DISPATCH_PROPERTYGET
Definition: oleauto.h:1007
#define V_I2(A)
Definition: oleauto.h:245
const GUID IID_IProvideClassInfo
const GUID IID_IDispatch
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
static char title[]
Definition: ps.c:92
#define DEFINE_GUID(name, l, w1, w2, b1, b2, b3, b4, b5, b6, b7, b8)
Definition: guiddef.h:68
#define IsEqualGUID(rguid1, rguid2)
Definition: guiddef.h:147
#define IsEqualIID(riid1, riid2)
Definition: guiddef.h:95
#define REFIID
Definition: guiddef.h:118
#define IID_NULL
Definition: guiddef.h:98
#define err(...)
#define delete_key(r, p, s)
Definition: reg_test.h:64
const WCHAR * str
#define REG_DWORD
Definition: sdbapi.c:615
static __inline const char * wine_dbgstr_guid(const GUID *id)
Definition: debug.h:181
short sh
Definition: format.c:272
Definition: cookie.c:202
Definition: parser.c:49
Definition: name.c:39
Definition: dhcpd.h:248
Definition: pdh_main.c:64
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:626
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:547
#define INVALID_FILE_ATTRIBUTES
Definition: vfdcmd.c:23
int retval
Definition: wcstombs.cpp:91
DWORD WINAPI GetLastError(void)
Definition: except.c:1042
void * arg
Definition: msvc.h:10
static HRESULT HRESULT_FROM_WIN32(unsigned int x)
Definition: winerror.h:210
#define DISP_E_PARAMNOTFOUND
Definition: winerror.h:3616
#define E_NOINTERFACE
Definition: winerror.h:3479
#define ERROR_PATH_NOT_FOUND
Definition: winerror.h:228
#define DISP_E_MEMBERNOTFOUND
Definition: winerror.h:3615
#define DISP_E_EXCEPTION
Definition: winerror.h:3621
#define E_POINTER
Definition: winerror.h:3480
#define DISP_E_TYPEMISMATCH
Definition: winerror.h:3617
#define ERROR_NOACCESS
Definition: winerror.h:902
#define HKEY_CURRENT_USER
Definition: winreg.h:11
#define test_provideclassinfo(a, b)
Definition: wshom.c:46
static void test_registry(void)
Definition: wshom.c:390
static void check_interface_(unsigned int line, void *iface_ptr, REFIID iid, BOOL supported)
Definition: wshom.c:32
static void test_wshnetwork(void)
Definition: wshom.c:692
static void test_popup(void)
Definition: wshom.c:645
static void check_bstr_length(BSTR str, int line)
Definition: wshom.c:72
#define CHECK_BSTR_LENGTH(str)
Definition: wshom.c:71
static void test_wshshell(void)
Definition: wshom.c:78
static void _test_provideclassinfo(IDispatch *disp, const GUID *guid, int line)
Definition: wshom.c:47
#define check_interface(a, b, c)
Definition: wshom.c:31
unsigned char BYTE
Definition: xxhash.c:193