Author: akhaldi Date: Sun Mar 29 13:36:03 2015 New Revision: 66954
URL: http://svn.reactos.org/svn/reactos?rev=66954&view=rev Log: [WSHOM_WINETEST] Sync with Wine Staging 1.7.37. CORE-9246
Modified: trunk/rostests/winetests/wshom/CMakeLists.txt trunk/rostests/winetests/wshom/wshom.c trunk/rostests/winetests/wshom/wshom.idl
Modified: trunk/rostests/winetests/wshom/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/wshom/CMakeLists... ============================================================================== --- trunk/rostests/winetests/wshom/CMakeLists.txt [iso-8859-1] (original) +++ trunk/rostests/winetests/wshom/CMakeLists.txt [iso-8859-1] Sun Mar 29 13:36:03 2015 @@ -1,8 +1,11 @@ +add_definitions(-DUSE_WINE_TODOS)
-add_definitions(-DUSE_WINE_TODOS) +remove_definitions(-D_WIN32_WINNT=0x502) +add_definitions(-D_WIN32_WINNT=0x600) + add_idl_headers(wshom_winetest_idlheaders wshom.idl) add_executable(wshom_winetest wshom.c testlist.c) set_module_type(wshom_winetest win32cui) -add_importlibs(wshom_winetest oleaut32 ole32 msvcrt kernel32) +add_importlibs(wshom_winetest oleaut32 ole32 advapi32 msvcrt kernel32) add_dependencies(wshom_winetest stdole2 wshom_winetest_idlheaders) add_cd_file(TARGET wshom_winetest DESTINATION reactos/bin FOR all)
Modified: trunk/rostests/winetests/wshom/wshom.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/wshom/wshom.c?re... ============================================================================== --- trunk/rostests/winetests/wshom/wshom.c [iso-8859-1] (original) +++ trunk/rostests/winetests/wshom/wshom.c [iso-8859-1] Sun Mar 29 13:36:03 2015 @@ -23,6 +23,7 @@
#include <windef.h> #include <winbase.h> +#include <winreg.h> #include <initguid.h> #include <dispex.h> #include <wshom.h> @@ -35,6 +36,7 @@
static void test_wshshell(void) { + static const WCHAR notepadW[] = {'n','o','t','e','p','a','d','.','e','x','e',0}; static const WCHAR desktopW[] = {'D','e','s','k','t','o','p',0}; static const WCHAR lnk1W[] = {'f','i','l','e','.','l','n','k',0}; static const WCHAR pathW[] = {'%','P','A','T','H','%',0}; @@ -45,7 +47,7 @@ IDispatchEx *dispex; IWshCollection *coll; IDispatch *disp, *shortcut; - IUnknown *shell; + IUnknown *shell, *unk; IFolderCollection *folders; IWshShortcut *shcut; ITypeInfo *ti; @@ -53,16 +55,14 @@ TYPEATTR *tattr; DISPPARAMS dp; EXCEPINFO ei; - VARIANT arg, res; + VARIANT arg, res, arg2; BSTR str, ret; + DWORD retval; UINT err;
hr = CoCreateInstance(&CLSID_WshShell, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, &IID_IDispatch, (void**)&disp); - if(FAILED(hr)) { - win_skip("Could not create WshShell object: %08x\n", hr); - return; - } + ok(hr == S_OK, "got 0x%08x\n", hr);
hr = IDispatch_QueryInterface(disp, &IID_IWshShell3, (void**)&shell); EXPECT_HR(hr, S_OK); @@ -73,6 +73,17 @@
hr = IUnknown_QueryInterface(shell, &IID_IWshShell3, (void**)&sh3); EXPECT_HR(hr, S_OK); + + hr = IWshShell3_QueryInterface(sh3, &IID_IObjectWithSite, (void**)&unk); + ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); + + hr = IWshShell3_QueryInterface(sh3, &IID_IWshShell, (void**)&unk); + ok(hr == S_OK, "got 0x%08x\n", hr); + IUnknown_Release(unk); + + hr = IWshShell3_QueryInterface(sh3, &IID_IWshShell2, (void**)&unk); + ok(hr == S_OK, "got 0x%08x\n", hr); + IUnknown_Release(unk);
hr = IWshShell3_get_SpecialFolders(sh3, &coll); EXPECT_HR(hr, S_OK); @@ -173,17 +184,324 @@
IWshEnvironment_Release(env);
+ V_VT(&arg) = VT_I2; + V_I2(&arg) = 0; + V_VT(&arg2) = VT_ERROR; + V_ERROR(&arg2) = DISP_E_PARAMNOTFOUND; + + str = SysAllocString(notepadW); + hr = IWshShell3_Run(sh3, str, &arg, &arg2, NULL); + ok(hr == E_POINTER, "got 0x%08x\n", hr); + + retval = 10; + hr = IWshShell3_Run(sh3, str, NULL, &arg2, &retval); + ok(hr == E_POINTER, "got 0x%08x\n", hr); + ok(retval == 10, "got %u\n", retval); + + retval = 10; + hr = IWshShell3_Run(sh3, str, &arg, NULL, &retval); + ok(hr == E_POINTER, "got 0x%08x\n", hr); + ok(retval == 10, "got %u\n", retval); + + retval = 10; + V_VT(&arg2) = VT_ERROR; + V_ERROR(&arg2) = 0; + hr = IWshShell3_Run(sh3, str, &arg, &arg2, &retval); + ok(hr == DISP_E_TYPEMISMATCH, "got 0x%08x\n", hr); + ok(retval == 10, "got %u\n", retval); + + SysFreeString(str); + IWshCollection_Release(coll); IDispatch_Release(disp); IWshShell3_Release(sh3); IUnknown_Release(shell); }
+/* delete key and all its subkeys */ +static DWORD delete_key(HKEY hkey) +{ + char name[MAX_PATH]; + DWORD ret; + + while (!(ret = RegEnumKeyA(hkey, 0, name, sizeof(name)))) { + HKEY tmp; + if (!(ret = RegOpenKeyExA(hkey, name, 0, KEY_ENUMERATE_SUB_KEYS, &tmp))) { + ret = delete_key(tmp); + RegCloseKey(tmp); + } + if (ret) break; + } + if (ret != ERROR_NO_MORE_ITEMS) return ret; + RegDeleteKeyA(hkey, ""); + return 0; +} + +static void test_registry(void) +{ + static const WCHAR keypathW[] = {'H','K','E','Y','_','C','U','R','R','E','N','T','_','U','S','E','R','\', + 'S','o','f','t','w','a','r','e','\','W','i','n','e','\','T','e','s','t','\',0}; + + static const WCHAR regszW[] = {'r','e','g','s','z',0}; + static const WCHAR regdwordW[] = {'r','e','g','d','w','o','r','d',0}; + static const WCHAR regbinaryW[] = {'r','e','g','b','i','n','a','r','y',0}; + static const WCHAR regmultiszW[] = {'r','e','g','m','u','l','t','i','s','z',0}; + + static const WCHAR regsz1W[] = {'H','K','E','Y','_','C','U','R','R','E','N','T','_','U','S','E','R','\', + 'S','o','f','t','w','a','r','e','\','W','i','n','e','\','T','e','s','t','\','r','e','g','s','z','1',0}; + static const WCHAR foobarW[] = {'f','o','o','b','a','r',0}; + static const WCHAR fooW[] = {'f','o','o',0}; + static const WCHAR brokenW[] = {'H','K','E','Y','_','b','r','o','k','e','n','_','k','e','y',0}; + static const WCHAR broken2W[] = {'H','K','E','Y','_','C','U','R','R','E','N','T','_','U','S','E','R','a',0}; + WCHAR pathW[MAX_PATH]; + DWORD dwvalue, type; + VARIANT value, v; + IWshShell3 *sh3; + VARTYPE vartype; + LONG bound; + HRESULT hr; + BSTR name; + HKEY root; + LONG ret; + UINT dim; + + hr = CoCreateInstance(&CLSID_WshShell, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IWshShell3, (void**)&sh3); + ok(hr == S_OK, "got 0x%08x\n", hr); + + /* RegRead() */ + V_VT(&value) = VT_I2; + hr = IWshShell3_RegRead(sh3, NULL, &value); + ok(hr == E_POINTER, "got 0x%08x\n", hr); + ok(V_VT(&value) == VT_I2, "got %d\n", V_VT(&value)); + + name = SysAllocString(brokenW); + hr = IWshShell3_RegRead(sh3, name, NULL); + ok(hr == E_POINTER, "got 0x%08x\n", hr); + V_VT(&value) = VT_I2; + hr = IWshShell3_RegRead(sh3, name, &value); + ok(hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "got 0x%08x\n", hr); + ok(V_VT(&value) == VT_I2, "got %d\n", V_VT(&value)); + SysFreeString(name); + + name = SysAllocString(broken2W); + V_VT(&value) = VT_I2; + hr = IWshShell3_RegRead(sh3, name, &value); + ok(hr == HRESULT_FROM_WIN32(ERROR_PATH_NOT_FOUND), "got 0x%08x\n", hr); + ok(V_VT(&value) == VT_I2, "got %d\n", V_VT(&value)); + SysFreeString(name); + + ret = RegCreateKeyA(HKEY_CURRENT_USER, "Software\Wine\Test", &root); + ok(ret == 0, "got %d\n", ret); + + ret = RegSetValueExA(root, "regsz", 0, REG_SZ, (const BYTE*)"foobar", 7); + ok(ret == 0, "got %d\n", ret); + + ret = RegSetValueExA(root, "regmultisz", 0, REG_MULTI_SZ, (const BYTE*)"foo\0bar\0", 9); + ok(ret == 0, "got %d\n", ret); + + dwvalue = 10; + ret = RegSetValueExA(root, "regdword", 0, REG_DWORD, (const BYTE*)&dwvalue, sizeof(dwvalue)); + ok(ret == 0, "got %d\n", ret); + + dwvalue = 11; + ret = RegSetValueExA(root, "regbinary", 0, REG_BINARY, (const BYTE*)&dwvalue, sizeof(dwvalue)); + ok(ret == 0, "got %d\n", ret); + + /* REG_SZ */ + lstrcpyW(pathW, keypathW); + lstrcatW(pathW, regszW); + name = SysAllocString(pathW); + VariantInit(&value); + hr = IWshShell3_RegRead(sh3, name, &value); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&value) == VT_BSTR, "got %d\n", V_VT(&value)); + ok(!lstrcmpW(V_BSTR(&value), foobarW), "got %s\n", wine_dbgstr_w(V_BSTR(&value))); + VariantClear(&value); + SysFreeString(name); + + /* REG_DWORD */ + lstrcpyW(pathW, keypathW); + lstrcatW(pathW, regdwordW); + name = SysAllocString(pathW); + VariantInit(&value); + hr = IWshShell3_RegRead(sh3, name, &value); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&value) == VT_I4, "got %d\n", V_VT(&value)); + ok(V_I4(&value) == 10, "got %d\n", V_I4(&value)); + SysFreeString(name); + + /* REG_BINARY */ + lstrcpyW(pathW, keypathW); + lstrcatW(pathW, regbinaryW); + name = SysAllocString(pathW); + VariantInit(&value); + hr = IWshShell3_RegRead(sh3, name, &value); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&value) == (VT_ARRAY|VT_VARIANT), "got 0x%x\n", V_VT(&value)); + dim = SafeArrayGetDim(V_ARRAY(&value)); + ok(dim == 1, "got %u\n", dim); + + hr = SafeArrayGetLBound(V_ARRAY(&value), 1, &bound); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(bound == 0, "got %u\n", bound); + + hr = SafeArrayGetUBound(V_ARRAY(&value), 1, &bound); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(bound == 3, "got %u\n", bound); + + hr = SafeArrayGetVartype(V_ARRAY(&value), &vartype); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(vartype == VT_VARIANT, "got %d\n", vartype); + + bound = 0; + hr = SafeArrayGetElement(V_ARRAY(&value), &bound, &v); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&v) == VT_UI1, "got %d\n", V_VT(&v)); + ok(V_UI1(&v) == 11, "got %u\n", V_UI1(&v)); + VariantClear(&v); + VariantClear(&value); + SysFreeString(name); + + /* REG_MULTI_SZ */ + lstrcpyW(pathW, keypathW); + lstrcatW(pathW, regmultiszW); + name = SysAllocString(pathW); + VariantInit(&value); + hr = IWshShell3_RegRead(sh3, name, &value); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&value) == (VT_ARRAY|VT_VARIANT), "got 0x%x\n", V_VT(&value)); + + dim = SafeArrayGetDim(V_ARRAY(&value)); + ok(dim == 1, "got %u\n", dim); + + hr = SafeArrayGetLBound(V_ARRAY(&value), 1, &bound); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(bound == 0, "got %u\n", bound); + + hr = SafeArrayGetUBound(V_ARRAY(&value), 1, &bound); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(bound == 1, "got %u\n", bound); + + hr = SafeArrayGetVartype(V_ARRAY(&value), &vartype); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(vartype == VT_VARIANT, "got %d\n", vartype); + + bound = 0; + hr = SafeArrayGetElement(V_ARRAY(&value), &bound, &v); + ok(hr == S_OK, "got 0x%08x\n", hr); + ok(V_VT(&v) == VT_BSTR, "got %d\n", V_VT(&v)); + ok(!lstrcmpW(V_BSTR(&v), fooW), "got %s\n", wine_dbgstr_w(V_BSTR(&v))); + VariantClear(&v); + VariantClear(&value); + + name = SysAllocString(regsz1W); + V_VT(&value) = VT_I2; + hr = IWshShell3_RegRead(sh3, name, &value); + ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "got 0x%08x\n", hr); + ok(V_VT(&value) == VT_I2, "got %d\n", V_VT(&value)); + VariantClear(&value); + SysFreeString(name); + + delete_key(root); + + /* RegWrite() */ + ret = RegCreateKeyA(HKEY_CURRENT_USER, "Software\Wine\Test", &root); + ok(ret == 0, "got %d\n", ret); + + hr = IWshShell3_RegWrite(sh3, NULL, NULL, NULL); + ok(hr == E_POINTER, "got 0x%08x\n", hr); + + lstrcpyW(pathW, keypathW); + lstrcatW(pathW, regszW); + name = SysAllocString(pathW); + + hr = IWshShell3_RegWrite(sh3, name, NULL, NULL); + ok(hr == E_POINTER, "got 0x%08x\n", hr); + + VariantInit(&value); + hr = IWshShell3_RegWrite(sh3, name, &value, NULL); + ok(hr == E_POINTER, "got 0x%08x\n", hr); + + hr = IWshShell3_RegWrite(sh3, name, &value, &value); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + + /* type is optional */ + V_VT(&v) = VT_ERROR; + V_ERROR(&v) = DISP_E_PARAMNOTFOUND; + hr = IWshShell3_RegWrite(sh3, name, &value, &v); + ok(hr == S_OK, "got 0x%08x\n", hr); + + /* default type is REG_SZ */ + V_VT(&value) = VT_I4; + V_I4(&value) = 12; + hr = IWshShell3_RegWrite(sh3, name, &value, &v); + ok(hr == S_OK, "got 0x%08x\n", hr); + + type = REG_NONE; + ret = RegGetValueA(root, NULL, "regsz", RRF_RT_ANY, &type, NULL, NULL); + ok(ret == ERROR_SUCCESS, "got %d\n", ret); + ok(type == REG_SZ, "got %d\n", type); + + ret = RegDeleteValueA(root, "regsz"); + ok(ret == ERROR_SUCCESS, "got %d\n", ret); + V_VT(&value) = VT_BSTR; + V_BSTR(&value) = SysAllocString(regszW); + hr = IWshShell3_RegWrite(sh3, name, &value, &v); + ok(hr == S_OK, "got 0x%08x\n", hr); + VariantClear(&value); + + type = REG_NONE; + ret = RegGetValueA(root, NULL, "regsz", RRF_RT_ANY, &type, NULL, NULL); + ok(ret == ERROR_SUCCESS, "got %d\n", ret); + ok(type == REG_SZ, "got %d\n", type); + + ret = RegDeleteValueA(root, "regsz"); + ok(ret == ERROR_SUCCESS, "got %d\n", ret); + V_VT(&value) = VT_R4; + V_R4(&value) = 1.2; + hr = IWshShell3_RegWrite(sh3, name, &value, &v); + ok(hr == S_OK, "got 0x%08x\n", hr); + VariantClear(&value); + + type = REG_NONE; + ret = RegGetValueA(root, NULL, "regsz", RRF_RT_ANY, &type, NULL, NULL); + ok(ret == ERROR_SUCCESS, "got %d\n", ret); + ok(type == REG_SZ, "got %d\n", type); + + ret = RegDeleteValueA(root, "regsz"); + ok(ret == ERROR_SUCCESS, "got %d\n", ret); + V_VT(&value) = VT_R4; + V_R4(&value) = 1.2; + V_VT(&v) = VT_I2; + V_I2(&v) = 1; + hr = IWshShell3_RegWrite(sh3, name, &value, &v); + ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); + VariantClear(&value); + + SysFreeString(name); + + delete_key(root); + IWshShell3_Release(sh3); +} + START_TEST(wshom) { + IUnknown *unk; + HRESULT hr; + CoInitialize(NULL);
+ hr = CoCreateInstance(&CLSID_WshShell, NULL, CLSCTX_INPROC_SERVER|CLSCTX_INPROC_HANDLER, + &IID_IUnknown, (void**)&unk); + if (FAILED(hr)) { + win_skip("Could not create WshShell object: %08x\n", hr); + return; + } + IUnknown_Release(unk); + test_wshshell(); + test_registry();
CoUninitialize(); }
Modified: trunk/rostests/winetests/wshom/wshom.idl URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/wshom/wshom.idl?... ============================================================================== --- trunk/rostests/winetests/wshom/wshom.idl [iso-8859-1] (original) +++ trunk/rostests/winetests/wshom/wshom.idl [iso-8859-1] Sun Mar 29 13:36:03 2015 @@ -526,7 +526,7 @@ [in] BSTR Command, [in, optional] VARIANT* WindowStyle, [in, optional] VARIANT* WaitOnReturn, - [out, retval] int* out_ExitCode); + [out, retval] DWORD* out_ExitCode);
[id(0x03e9)] HRESULT Popup(