Author: akhaldi Date: Sun Jun 4 01:52:12 2017 New Revision: 74889
URL: http://svn.reactos.org/svn/reactos?rev=74889&view=rev Log: [SHELL32_WINETEST] Sync with Wine Staging 2.9. CORE-13362
Modified: trunk/rostests/winetests/shell32/CMakeLists.txt trunk/rostests/winetests/shell32/ebrowser.c trunk/rostests/winetests/shell32/shelldispatch.c trunk/rostests/winetests/shell32/shelllink.c trunk/rostests/winetests/shell32/shellole.c trunk/rostests/winetests/shell32/shellpath.c trunk/rostests/winetests/shell32/shfldr_special.c trunk/rostests/winetests/shell32/shlfileop.c trunk/rostests/winetests/shell32/shlfolder.c trunk/rostests/winetests/shell32/shlview.c
Modified: trunk/rostests/winetests/shell32/CMakeLists.txt URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shell32/CMakeLis... ============================================================================== --- trunk/rostests/winetests/shell32/CMakeLists.txt [iso-8859-1] (original) +++ trunk/rostests/winetests/shell32/CMakeLists.txt [iso-8859-1] Sun Jun 4 01:52:12 2017 @@ -27,7 +27,7 @@ add_executable(shell32_winetest ${SOURCE}) target_link_libraries(shell32_winetest uuid) set_module_type(shell32_winetest win32cui) -add_importlibs(shell32_winetest shell32 ole32 oleaut32 user32 advapi32 msvcrt kernel32) +add_importlibs(shell32_winetest shell32 ole32 oleaut32 user32 gdi32 advapi32 msvcrt kernel32)
if(MSVC) add_importlibs(shell32_winetest ntdll)
Modified: trunk/rostests/winetests/shell32/ebrowser.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shell32/ebrowser... ============================================================================== --- trunk/rostests/winetests/shell32/ebrowser.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shell32/ebrowser.c [iso-8859-1] Sun Jun 4 01:52:12 2017 @@ -71,6 +71,10 @@ DEFINE_GUID(IID_UnknownInterface18, 0x1fc45c07, 0x9e35, 0x4276, 0xad,0x7f, 0x08,0x60,0x3a,0xa0,0xf6,0x0f); DEFINE_GUID(IID_UnknownInterface19, 0xacd9b67a, 0xceab, 0x4c6c, 0x90,0xa1, 0xe8,0x57,0xc6,0x59,0xe3,0x9d); DEFINE_GUID(IID_UnknownInterface20, 0xd0fe6f62, 0xdea4, 0x46c9, 0x9d,0xae, 0x36,0xcb,0x13,0x99,0x78,0xfa); +DEFINE_GUID(IID_UnknownInterface21, 0x732c1ccd, 0xbc5c, 0x4065, 0x88,0xcb, 0xfb,0x5b,0xce,0xa7,0x1f,0x66); +DEFINE_GUID(IID_UnknownInterface22, 0xc13b3d3a, 0x10d6, 0x43f5, 0x98,0xdb, 0xb7,0xdd,0xd9,0x87,0xb3,0x3d); +DEFINE_GUID(IID_UnknownInterface23, 0x2e228ba3, 0xea25, 0x4378, 0x97,0xb6, 0xd5,0x74,0xfa,0xeb,0xa3,0x56); +DEFINE_GUID(IID_UnknownInterface24, 0xd56a2092, 0x7dbf, 0x4144, 0xa1,0x10, 0xc2,0x96,0x3a,0x70,0x98,0x32);
static HWND hwnd;
@@ -571,7 +575,7 @@ test_qinterface(IID_IUnknown, S_OK); test_qinterface(IID_IExplorerBrowser, S_OK); test_qinterface(IID_IShellBrowser, S_OK); - todo_wine test_qinterface(IID_IOleWindow, S_OK); + test_qinterface(IID_IOleWindow, S_OK); test_qinterface(IID_ICommDlgBrowser, S_OK); test_qinterface(IID_ICommDlgBrowser2, S_OK); test_qinterface(IID_ICommDlgBrowser3, S_OK); @@ -960,6 +964,13 @@ { &IID_UnknownInterface16, &IID_UnknownInterface16, 0, NULL }, { &IID_UnknownInterface17, &IID_UnknownInterface17, 0, NULL }, { &IID_UnknownInterface17, &IID_UnknownInterface19, 0, NULL }, + /* Win 10 */ + { &IID_UnknownInterface21, &IID_UnknownInterface21, 0, NULL }, + { &IID_UnknownInterface21, &IID_IFileDialog, 0, NULL }, + { &IID_UnknownInterface22, &IID_UnknownInterface22, 0, NULL }, + { &IID_UnknownInterface23, &IID_UnknownInterface23, 0, NULL }, + { &IID_UnknownInterface24, &IID_UnknownInterface24, 0, NULL }, + { &IID_UnknownInterface24, &IID_IFileDialog, 0, NULL },
/* Other services requested in Vista, Windows 2008 but not in Windows 7 */ { &IID_IBrowserSettings_Vista, &IID_IBrowserSettings_Vista, 0, NULL },
Modified: trunk/rostests/winetests/shell32/shelldispatch.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shell32/shelldis... ============================================================================== --- trunk/rostests/winetests/shell32/shelldispatch.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shell32/shelldispatch.c [iso-8859-1] Sun Jun 4 01:52:12 2017 @@ -27,6 +27,8 @@ #include "shlwapi.h" #include "wine/test.h"
+#include "initguid.h" + #define EXPECT_HR(hr,hr_exp) \ ok(hr == hr_exp, "got 0x%08x, expected 0x%08x\n", hr, hr_exp)
@@ -36,6 +38,9 @@ static HRESULT (WINAPI *pSHGetNameFromIDList)(PCIDLIST_ABSOLUTE,SIGDN,PWSTR*); static HRESULT (WINAPI *pSHGetSpecialFolderLocation)(HWND, int, LPITEMIDLIST *); static DWORD (WINAPI *pGetLongPathNameW)(LPCWSTR, LPWSTR, DWORD); + +/* Updated Windows 7 has a new IShellDispatch6 in its typelib */ +DEFINE_GUID(IID_IWin7ShellDispatch6, 0x34936ba1, 0x67ad, 0x4c41, 0x99,0xb8, 0x8c,0x12,0xdf,0xf1,0xe9,0x74);
static void init_function_pointers(void) { @@ -52,6 +57,48 @@
static void test_namespace(void) { + static const ShellSpecialFolderConstants special_folders[] = + { + ssfDESKTOP, + ssfPROGRAMS, + ssfCONTROLS, + ssfPRINTERS, + ssfPERSONAL, + ssfFAVORITES, + ssfSTARTUP, + ssfRECENT, + ssfSENDTO, + ssfBITBUCKET, + ssfSTARTMENU, + ssfDESKTOPDIRECTORY, + ssfDRIVES, + ssfNETWORK, + ssfNETHOOD, + ssfFONTS, + ssfTEMPLATES, + ssfCOMMONSTARTMENU, + ssfCOMMONPROGRAMS, + ssfCOMMONSTARTUP, + ssfCOMMONDESKTOPDIR, + ssfAPPDATA, + ssfPRINTHOOD, + ssfLOCALAPPDATA, + ssfALTSTARTUP, + ssfCOMMONALTSTARTUP, + ssfCOMMONFAVORITES, + ssfINTERNETCACHE, + ssfCOOKIES, + ssfHISTORY, + ssfCOMMONAPPDATA, + ssfWINDOWS, + ssfSYSTEM, + ssfPROGRAMFILES, + ssfMYPICTURES, + ssfPROFILE, + ssfSYSTEMx86, + ssfPROGRAMFILESx86, + }; + static const WCHAR backslashW[] = {'\',0}; static const WCHAR clsidW[] = { ':',':','{','6','4','5','F','F','0','4','0','-','5','0','8','1','-', @@ -67,7 +114,7 @@ FolderItem *item; VARIANT var; BSTR title, item_path; - int len; + int len, i;
r = CoCreateInstance(&CLSID_Shell, NULL, CLSCTX_INPROC_SERVER, &IID_IShellDispatch, (LPVOID*)&sd); @@ -85,6 +132,21 @@ r = IShellDispatch_NameSpace(sd, var, &folder); ok(r == S_FALSE, "expected S_FALSE, got %08x\n", r); ok(folder == NULL, "expected NULL, got %p\n", folder); + + /* test valid folder ids */ + for (i = 0; i < sizeof(special_folders)/sizeof(special_folders[0]); i++) + { + V_VT(&var) = VT_I4; + V_I4(&var) = special_folders[i]; + folder = (void*)0xdeadbeef; + r = IShellDispatch_NameSpace(sd, var, &folder); + if (special_folders[i] == ssfALTSTARTUP || special_folders[i] == ssfCOMMONALTSTARTUP) + ok(r == S_OK || broken(r == S_FALSE) /* winxp */, "Failed to get folder for index %#x, got %08x\n", special_folders[i], r); + else + ok(r == S_OK, "Failed to get folder for index %#x, got %08x\n", special_folders[i], r); + if (folder) + Folder_Release(folder); + }
V_VT(&var) = VT_I4; V_I4(&var) = -1; @@ -93,6 +155,8 @@ todo_wine { ok(r == S_FALSE, "expected S_FALSE, got %08x\n", r); ok(folder == NULL, "got %p\n", folder); + if (r == S_OK) + Folder_Release(folder); } V_VT(&var) = VT_I4; V_I4(&var) = ssfPROGRAMFILES; @@ -345,7 +409,7 @@ ok(r == S_OK, "Folder::Items failed: %08x\n", r); ok(!!items, "items is null\n"); r = FolderItems_QueryInterface(items, &IID_FolderItems2, (void**)&items2); - ok(r == S_OK || broken(E_NOINTERFACE) /* xp and later */, "FolderItems::QueryInterface failed: %08x\n", r); + ok(r == S_OK || broken(r == E_NOINTERFACE) /* xp and later */, "FolderItems::QueryInterface failed: %08x\n", r); ok(!!items2 || broken(!items2) /* xp and later */, "items2 is null\n"); r = FolderItems_QueryInterface(items, &IID_FolderItems3, (void**)&items3); ok(r == S_OK, "FolderItems::QueryInterface failed: %08x\n", r); @@ -356,9 +420,7 @@ r = FolderItems_get_Count(items, NULL);
r = FolderItems_get_Count(items, &lcount); -todo_wine ok(r == S_OK, "FolderItems::get_Count failed: %08x\n", r); -todo_wine ok(!lcount, "expected 0 files, got %d\n", lcount);
V_VT(&var) = VT_I4; @@ -529,6 +591,7 @@ &IID_IShellDispatch5, &IID_IShellDispatch4, &IID_IShellDispatch2, + &IID_IWin7ShellDispatch6, &IID_NULL }; IShellFolderViewDual *viewdual;
Modified: trunk/rostests/winetests/shell32/shelllink.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shell32/shelllin... ============================================================================== --- trunk/rostests/winetests/shell32/shelllink.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shell32/shelllink.c [iso-8859-1] Sun Jun 4 01:52:12 2017 @@ -27,9 +27,12 @@ #include "shobjidl.h" #include "shlobj.h" #include "shellapi.h" +#include "commoncontrols.h" #include "wine/test.h"
#include "shell32_test.h" + +#include <reactos/undocshell.h>
#ifndef SLDF_HAS_LOGO3ID # define SLDF_HAS_LOGO3ID 0x00000800 /* not available in the Vista SDK */ @@ -43,6 +46,7 @@ static DWORD (WINAPI *pGetLongPathNameA)(LPCSTR, LPSTR, DWORD); static DWORD (WINAPI *pGetShortPathNameA)(LPCSTR, LPSTR, DWORD); static UINT (WINAPI *pSHExtractIconsW)(LPCWSTR, int, int, int, HICON *, UINT *, UINT, UINT); +static BOOL (WINAPI *pIsProcessDPIAware)(void);
static const GUID _IID_IShellLinkDataList = { 0x45e2b4ae, 0xb1c3, 0x11d0, @@ -1150,11 +1154,257 @@ IShellLinkW_Release(linkW); }
+static void test_ExtractIcon(void) +{ + static const WCHAR nameW[] = {'\','e','x','t','r','a','c','t','i','c','o','n','_','t','e','s','t','.','t','x','t',0}; + static const WCHAR shell32W[] = {'s','h','e','l','l','3','2','.','d','l','l',0}; + WCHAR pathW[MAX_PATH]; + HICON hicon, hicon2; + char path[MAX_PATH]; + HANDLE file; + int r; + ICONINFO info; + BITMAP bm; + + /* specified instance handle */ + hicon = ExtractIconA(GetModuleHandleA("shell32.dll"), NULL, 0); +todo_wine + ok(hicon == NULL, "Got icon %p\n", hicon); + hicon2 = ExtractIconA(GetModuleHandleA("shell32.dll"), "shell32.dll", -1); + ok(hicon2 != NULL, "Got icon %p\n", hicon2); + + /* existing index */ + hicon = ExtractIconA(NULL, "shell32.dll", 0); + ok(hicon != NULL && HandleToLong(hicon) != -1, "Got icon %p\n", hicon); + DestroyIcon(hicon); + + /* returns number of resources */ + hicon = ExtractIconA(NULL, "shell32.dll", -1); + ok(HandleToLong(hicon) > 1 && hicon == hicon2, "Got icon %p\n", hicon); + + /* invalid index, valid dll name */ + hicon = ExtractIconA(NULL, "shell32.dll", 3000); + ok(hicon == NULL, "Got icon %p\n", hicon); + + /* Create a temporary non-executable file */ + GetTempPathA(sizeof(path), path); + strcat(path, "\extracticon_test.txt"); + file = CreateFileA(path, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + ok(file != INVALID_HANDLE_VALUE, "Failed to create a test file\n"); + CloseHandle(file); + + hicon = ExtractIconA(NULL, path, 0); +todo_wine + ok(hicon == NULL, "Got icon %p\n", hicon); + + hicon = ExtractIconA(NULL, path, -1); + ok(hicon == NULL, "Got icon %p\n", hicon); + + hicon = ExtractIconA(NULL, path, 1); +todo_wine + ok(hicon == NULL, "Got icon %p\n", hicon); + + r = DeleteFileA(path); + ok(r, "failed to delete file %s (%d)\n", path, GetLastError()); + + /* same for W variant */ +if (0) +{ + /* specified instance handle, crashes on XP, 2k3 */ + hicon = ExtractIconW(GetModuleHandleA("shell32.dll"), NULL, 0); + ok(hicon == NULL, "Got icon %p\n", hicon); +} + hicon2 = ExtractIconW(GetModuleHandleA("shell32.dll"), shell32W, -1); + ok(hicon2 != NULL, "Got icon %p\n", hicon2); + + /* existing index */ + hicon = ExtractIconW(NULL, shell32W, 0); + ok(hicon != NULL && HandleToLong(hicon) != -1, "Got icon %p\n", hicon); + GetIconInfo(hicon, &info); + GetObjectW(info.hbmColor, sizeof(bm), &bm); + ok(bm.bmWidth == GetSystemMetrics(SM_CXICON), "got %d\n", bm.bmWidth); + ok(bm.bmHeight == GetSystemMetrics(SM_CYICON), "got %d\n", bm.bmHeight); + DestroyIcon(hicon); + + /* returns number of resources */ + hicon = ExtractIconW(NULL, shell32W, -1); + ok(HandleToLong(hicon) > 1 && hicon == hicon2, "Got icon %p\n", hicon); + + /* invalid index, valid dll name */ + hicon = ExtractIconW(NULL, shell32W, 3000); + ok(hicon == NULL, "Got icon %p\n", hicon); + + /* Create a temporary non-executable file */ + GetTempPathW(sizeof(pathW)/sizeof(pathW[0]), pathW); + lstrcatW(pathW, nameW); + file = CreateFileW(pathW, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); + ok(file != INVALID_HANDLE_VALUE, "Failed to create a test file\n"); + CloseHandle(file); + + hicon = ExtractIconW(NULL, pathW, 0); +todo_wine + ok(hicon == NULL, "Got icon %p\n", hicon); + + hicon = ExtractIconW(NULL, pathW, -1); + ok(hicon == NULL, "Got icon %p\n", hicon); + + hicon = ExtractIconW(NULL, pathW, 1); +todo_wine + ok(hicon == NULL, "Got icon %p\n", hicon); + + r = DeleteFileW(pathW); + ok(r, "failed to delete file %s (%d)\n", path, GetLastError()); +} + +static void test_ExtractAssociatedIcon(void) +{ + char pathA[MAX_PATH]; + HICON hicon; + WORD index; + + /* empty path */ + index = 0; + *pathA = 0; + hicon = ExtractAssociatedIconA(NULL, pathA, &index); +todo_wine { + ok(hicon != NULL, "Got icon %p\n", hicon); + ok(!*pathA, "Unexpected path %s\n", pathA); + ok(index == 0, "Unexpected index %u\n", index); +} + DestroyIcon(hicon); + + /* by index */ + index = 0; + strcpy(pathA, "shell32.dll"); + hicon = ExtractAssociatedIconA(NULL, pathA, &index); + ok(hicon != NULL, "Got icon %p\n", hicon); + ok(!strcmp(pathA, "shell32.dll"), "Unexpected path %s\n", pathA); + ok(index == 0, "Unexpected index %u\n", index); + DestroyIcon(hicon); + + /* valid dll name, invalid index */ + index = 5000; + strcpy(pathA, "user32.dll"); + hicon = ExtractAssociatedIconA(NULL, pathA, &index); + CharLowerBuffA(pathA, strlen(pathA)); +todo_wine { + ok(hicon != NULL, "Got icon %p\n", hicon); + ok(!!strstr(pathA, "shell32.dll"), "Unexpected path %s\n", pathA); +} + ok(index != 5000, "Unexpected index %u\n", index); + DestroyIcon(hicon); + + /* associated icon */ + index = 0xcaca; + strcpy(pathA, "dummy.exe"); + hicon = ExtractAssociatedIconA(NULL, pathA, &index); + CharLowerBuffA(pathA, strlen(pathA)); +todo_wine { + ok(hicon != NULL, "Got icon %p\n", hicon); + ok(!!strstr(pathA, "shell32.dll"), "Unexpected path %s\n", pathA); +} + ok(index != 0xcaca, "Unexpected index %u\n", index); + DestroyIcon(hicon); +} + +static int get_shell_icon_size(void) +{ + char buf[10]; + DWORD value = 32, size = sizeof(buf), type; + HKEY key; + + if (!RegOpenKeyA( HKEY_CURRENT_USER, "Control Panel\Desktop\WindowMetrics", &key )) + { + if (!RegQueryValueExA( key, "Shell Icon Size", NULL, &type, (BYTE *)buf, &size ) && type == REG_SZ) + value = atoi( buf ); + RegCloseKey( key ); + } + return value; +} + +static void test_SHGetImageList(void) +{ + HRESULT hr; + IImageList *list, *list2; + BOOL ret; + HIMAGELIST lg, sm; + ULONG start_refs, refs; + int i, width, height, expect; + BOOL dpi_aware = pIsProcessDPIAware && pIsProcessDPIAware(); + + hr = SHGetImageList( SHIL_LARGE, &IID_IImageList, (void **)&list ); + ok( hr == S_OK, "got %08x\n", hr ); + start_refs = IImageList_AddRef( list ); + IImageList_Release( list ); + + hr = SHGetImageList( SHIL_LARGE, &IID_IImageList, (void **)&list2 ); + ok( hr == S_OK, "got %08x\n", hr ); + ok( list == list2, "lists differ\n" ); + refs = IImageList_AddRef( list ); + IImageList_Release( list ); + ok( refs == start_refs + 1, "got %d, start_refs %d\n", refs, start_refs ); + IImageList_Release( list2 ); + + hr = SHGetImageList( SHIL_SMALL, &IID_IImageList, (void **)&list2 ); + ok( hr == S_OK, "got %08x\n", hr ); + + ret = Shell_GetImageLists( &lg, &sm ); + ok( ret, "got %d\n", ret ); + ok( lg == (HIMAGELIST)list, "mismatch\n" ); + ok( sm == (HIMAGELIST)list2, "mismatch\n" ); + + /* Shell_GetImageLists doesn't take a reference */ + refs = IImageList_AddRef( list ); + IImageList_Release( list ); + ok( refs == start_refs, "got %d, start_refs %d\n", refs, start_refs ); + + IImageList_Release( list2 ); + IImageList_Release( list ); + + /* Test the icon sizes */ + for (i = 0; i <= SHIL_LAST; i++) + { + hr = SHGetImageList( i, &IID_IImageList, (void **)&list ); + ok( hr == S_OK || + broken( i == SHIL_JUMBO && hr == E_INVALIDARG ), /* XP and 2003 */ + "%d: got %08x\n", i, hr ); + if (FAILED(hr)) continue; + IImageList_GetIconSize( list, &width, &height ); + switch (i) + { + case SHIL_LARGE: + if (dpi_aware) expect = GetSystemMetrics( SM_CXICON ); + else expect = get_shell_icon_size(); + break; + case SHIL_SMALL: + if (dpi_aware) expect = GetSystemMetrics( SM_CXICON ) / 2; + else expect = GetSystemMetrics( SM_CXSMICON ); + break; + case SHIL_EXTRALARGE: + expect = (GetSystemMetrics( SM_CXICON ) * 3) / 2; + break; + case SHIL_SYSSMALL: + expect = GetSystemMetrics( SM_CXSMICON ); + break; + case SHIL_JUMBO: + expect = 256; + break; + } + todo_wine_if(i == SHIL_SYSSMALL && dpi_aware && expect != GetSystemMetrics( SM_CXICON ) / 2) + { + ok( width == expect, "%d: got %d expect %d\n", i, width, expect ); + ok( height == expect, "%d: got %d expect %d\n", i, height, expect ); + } + IImageList_Release( list ); + } +} + START_TEST(shelllink) { HRESULT r; HMODULE hmod = GetModuleHandleA("shell32.dll"); HMODULE hkernel32 = GetModuleHandleA("kernel32.dll"); + HMODULE huser32 = GetModuleHandleA("user32.dll");
pILFree = (void *)GetProcAddress(hmod, (LPSTR)155); pILIsEqual = (void *)GetProcAddress(hmod, (LPSTR)21); @@ -1164,6 +1414,7 @@ pGetLongPathNameA = (void *)GetProcAddress(hkernel32, "GetLongPathNameA"); pGetShortPathNameA = (void *)GetProcAddress(hkernel32, "GetShortPathNameA"); pSHExtractIconsW = (void *)GetProcAddress(hmod, "SHExtractIconsW"); + pIsProcessDPIAware = (void *)GetProcAddress(huser32, "IsProcessDPIAware");
r = CoInitialize(NULL); ok(r == S_OK, "CoInitialize failed (0x%08x)\n", r); @@ -1178,6 +1429,9 @@ test_SHGetStockIconInfo(); test_SHExtractIcons(); test_propertystore(); + test_ExtractIcon(); + test_ExtractAssociatedIcon(); + test_SHGetImageList();
CoUninitialize(); }
Modified: trunk/rostests/winetests/shell32/shellole.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shell32/shellole... ============================================================================== --- trunk/rostests/winetests/shell32/shellole.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shell32/shellole.c [iso-8859-1] Sun Jun 4 01:52:12 2017 @@ -866,7 +866,7 @@
if (!pSHCreateSessionKey) { - skip("SHCreateSessionKey is not implemented\n"); + win_skip("SHCreateSessionKey is not implemented\n"); return; }
@@ -889,12 +889,38 @@ RegCloseKey(hkey2); }
+static void test_dragdrophelper(void) +{ + IDragSourceHelper *dragsource; + IDropTargetHelper *target; + HRESULT hr; + + hr = CoCreateInstance(&CLSID_DragDropHelper, NULL, CLSCTX_INPROC_SERVER, &IID_IDropTargetHelper, (void **)&target); + ok(hr == S_OK, "Failed to create IDropTargetHelper, %#x\n", hr); + + hr = IDropTargetHelper_QueryInterface(target, &IID_IDragSourceHelper, (void **)&dragsource); + ok(hr == S_OK, "QI failed, %#x\n", hr); + IDragSourceHelper_Release(dragsource); + + IDropTargetHelper_Release(target); +} + START_TEST(shellole) { + HRESULT hr; + init(); + + hr = CoInitialize(NULL); + ok(hr == S_OK, "CoInitialize failed (0x%08x)\n", hr); + if (hr != S_OK) + return;
test_SHPropStg_functions(); test_SHCreateQueryCancelAutoPlayMoniker(); test_DragQueryFile(); test_SHCreateSessionKey(); -} + test_dragdrophelper(); + + CoUninitialize(); +}
Modified: trunk/rostests/winetests/shell32/shellpath.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shell32/shellpat... ============================================================================== --- trunk/rostests/winetests/shell32/shellpath.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shell32/shellpath.c [iso-8859-1] Sun Jun 4 01:52:12 2017 @@ -808,7 +808,7 @@ memset(&startup, 0, sizeof(startup)); startup.cb = sizeof(startup); startup.dwFlags = STARTF_USESHOWWINDOW; - startup.dwFlags = SW_SHOWNORMAL; + startup.wShowWindow = SW_SHOWNORMAL; CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info); winetest_wait_child_process( info.hProcess ); @@ -823,7 +823,7 @@ memset(&startup, 0, sizeof(startup)); startup.cb = sizeof(startup); startup.dwFlags = STARTF_USESHOWWINDOW; - startup.dwFlags = SW_SHOWNORMAL; + startup.wShowWindow = SW_SHOWNORMAL; CreateProcessA(NULL, buffer, NULL, NULL, FALSE, 0L, NULL, NULL, &startup, &info); ok(WaitForSingleObject(info.hProcess, 30000) == WAIT_OBJECT_0, @@ -860,12 +860,13 @@ ok(path == NULL, "got %p\n", path);
path = NULL; - hr = pSHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, &path); + hr = pSHGetKnownFolderPath(&FOLDERID_Desktop, KF_FLAG_DEFAULT_PATH, NULL, &path); ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr); ok(path != NULL, "expected path != NULL\n"); + CoTaskMemFree(path);
path = NULL; - hr = pSHGetKnownFolderPath(&FOLDERID_Desktop, KF_FLAG_DEFAULT_PATH, NULL, &path); + hr = pSHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, &path); ok(hr == S_OK, "expected S_OK, got 0x%08x\n", hr); ok(path != NULL, "expected path != NULL\n");
@@ -2038,9 +2039,11 @@ static void test_knownFolders(void) { static const WCHAR sWindows[] = {'W','i','n','d','o','w','s',0}; + static const WCHAR sWindows2[] = {'w','i','n','d','o','w','s',0}; static const WCHAR sExample[] = {'E','x','a','m','p','l','e',0}; static const WCHAR sExample2[] = {'E','x','a','m','p','l','e','2',0}; static const WCHAR sSubFolder[] = {'S','u','b','F','o','l','d','e','r',0}; + static const WCHAR sNoSuch[] = {'N','o','S','u','c','h',0}; static const WCHAR sBackslash[] = {'\',0}; static const KNOWNFOLDERID newFolderId = {0x01234567, 0x89AB, 0xCDEF, {0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x01} }; static const KNOWNFOLDERID subFolderId = {0xFEDCBA98, 0x7654, 0x3210, {0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF} }; @@ -2142,7 +2145,6 @@ }
hr = IKnownFolderManager_GetFolderByName(mgr, sWindows, &folder); - todo_wine ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr); if(SUCCEEDED(hr)) { @@ -2153,6 +2155,23 @@ hr = IKnownFolder_Release(folder); ok(hr == S_OK, "failed to release KnownFolder instance: 0x%08x\n", hr); } + + hr = IKnownFolderManager_GetFolderByName(mgr, sWindows2, &folder); + ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr); + if(SUCCEEDED(hr)) + { + hr = IKnownFolder_GetId(folder, &folderId); + ok(hr == S_OK, "failed to get folder id: 0x%08x\n", hr); + ok(IsEqualGUID(&folderId, &FOLDERID_Windows)==TRUE, "invalid KNOWNFOLDERID returned\n"); + + hr = IKnownFolder_Release(folder); + ok(hr == S_OK, "failed to release KnownFolder instance: 0x%08x\n", hr); + } + + folder = (IKnownFolder *)0xdeadbeef; + hr = IKnownFolderManager_GetFolderByName(mgr, sNoSuch, &folder); + ok(hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "got 0x%08x\n", hr); + ok(folder == NULL, "got %p\n", folder);
for(i=0; i<sizeof(known_folder_found)/sizeof(known_folder_found[0]); ++i) known_folder_found[i] = FALSE;
Modified: trunk/rostests/winetests/shell32/shfldr_special.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shell32/shfldr_s... ============================================================================== --- trunk/rostests/winetests/shell32/shfldr_special.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shell32/shfldr_special.c [iso-8859-1] Sun Jun 4 01:52:12 2017 @@ -166,7 +166,7 @@
details.str.u.pOleStr = NULL; hr = IShellFolder2_GetDetailsOf(folder, NULL, 0, &details); - ok(hr == S_OK || broken(E_NOTIMPL) /* W2K */, "got 0x%08x\n", hr); + ok(hr == S_OK || broken(hr == E_NOTIMPL) /* W2K */, "got 0x%08x\n", hr); if (SHELL_OsIsUnicode()) SHFree(details.str.u.pOleStr);
/* test every column if method is implemented */
Modified: trunk/rostests/winetests/shell32/shlfileop.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shell32/shlfileo... ============================================================================== --- trunk/rostests/winetests/shell32/shlfileop.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shell32/shlfileop.c [iso-8859-1] Sun Jun 4 01:52:12 2017 @@ -21,12 +21,16 @@ #include <stdarg.h> #include <stdio.h>
+#define COBJMACROS #define WINE_NOWINSOCK #include <windows.h> #include "shellapi.h" #include "shlobj.h" +#include "commoncontrols.h"
#include "wine/test.h" + +#include <reactos/undocshell.h>
#ifndef FOF_NORECURSION #define FOF_NORECURSION 0x1000 @@ -315,6 +319,37 @@ ok(shfi.iIcon != 0xdeadbeef, "iIcon was expected to change\n"); }
+static void check_icon_size( HICON icon, DWORD flags ) +{ + ICONINFO info; + BITMAP bm; + SIZE list_size, metrics_size; + IImageList *list; + + GetIconInfo( icon, &info ); + GetObjectW( info.hbmColor, sizeof(bm), &bm ); + + SHGetImageList( (flags & SHGFI_SMALLICON) ? SHIL_SMALL : SHIL_LARGE, + &IID_IImageList, (void **)&list ); + IImageList_GetIconSize( list, &list_size.cx, &list_size.cy ); + IImageList_Release( list ); + + metrics_size.cx = GetSystemMetrics( (flags & SHGFI_SMALLICON) ? SM_CXSMICON : SM_CXICON ); + metrics_size.cy = GetSystemMetrics( (flags & SHGFI_SMALLICON) ? SM_CYSMICON : SM_CYICON ); + + + if (flags & SHGFI_SHELLICONSIZE) + { + ok( bm.bmWidth == list_size.cx, "got %d expected %d\n", bm.bmWidth, list_size.cx ); + ok( bm.bmHeight == list_size.cy, "got %d expected %d\n", bm.bmHeight, list_size.cy ); + } + else + { + ok( bm.bmWidth == metrics_size.cx, "got %d expected %d\n", bm.bmWidth, metrics_size.cx ); + ok( bm.bmHeight == metrics_size.cy, "got %d expected %d\n", bm.bmHeight, metrics_size.cy ); + } +} + static void test_get_file_info_iconlist(void) { /* Test retrieving a handle to the system image list, and @@ -325,6 +360,8 @@ LPITEMIDLIST pidList; SHFILEINFOA shInfoa; SHFILEINFOW shInfow; + IImageList *small_list, *large_list; + ULONG start_refs, refs;
hr = SHGetSpecialFolderLocation(NULL, CSIDL_DESKTOP, &pidList); if (FAILED(hr)) { @@ -332,11 +369,22 @@ return; }
+ SHGetImageList( SHIL_LARGE, &IID_IImageList, (void **)&large_list ); + SHGetImageList( SHIL_SMALL, &IID_IImageList, (void **)&small_list ); + + start_refs = IImageList_AddRef( small_list ); + IImageList_Release( small_list ); + memset(&shInfoa, 0xcf, sizeof(shInfoa)); hSysImageList = (HIMAGELIST) SHGetFileInfoA((const char *)pidList, 0, &shInfoa, sizeof(shInfoa), SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_PIDL); - ok((hSysImageList != INVALID_HANDLE_VALUE) && (hSysImageList > (HIMAGELIST) 0xffff), "Can't get handle for CSIDL_DESKTOP imagelist\n"); + ok(hSysImageList == (HIMAGELIST)small_list, "got %p expect %p\n", hSysImageList, small_list); + refs = IImageList_AddRef( small_list ); + IImageList_Release( small_list ); + ok( refs == start_refs + 1 || + broken( refs == start_refs ), /* XP and 2003 */ + "got %d, start_refs %d\n", refs, start_refs ); todo_wine ok(shInfoa.hIcon == 0, "SHGetFileInfoA(CSIDL_DESKTOP, SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_PIDL) did not clear hIcon\n"); todo_wine ok(shInfoa.szTypeName[0] == 0, "SHGetFileInfoA(CSIDL_DESKTOP, SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_PIDL) did not clear szTypeName[0]\n"); ok(shInfoa.iIcon != 0xcfcfcfcf, "SHGetFileInfoA(CSIDL_DESKTOP, SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_PIDL) should set iIcon\n"); @@ -344,7 +392,7 @@ shInfoa.dwAttributes == 0 || /* Vista */ broken(shInfoa.dwAttributes != 0xcfcfcfcf), /* NT4 doesn't clear but sets this field */ "SHGetFileInfoA(CSIDL_DESKTOP, SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_PIDL), unexpected dwAttributes\n"); - CloseHandle(hSysImageList); + /* Don't release hSysImageList here (and in similar places below) because of the broken reference behaviour of XP and 2003. */
if (!pSHGetFileInfoW) { @@ -362,20 +410,19 @@ win_skip("SHGetFileInfoW is not implemented\n"); return; } - ok((hSysImageList != INVALID_HANDLE_VALUE) && (hSysImageList > (HIMAGELIST) 0xffff), "Can't get handle for CSIDL_DESKTOP imagelist\n"); + ok(hSysImageList == (HIMAGELIST)small_list, "got %p expect %p\n", hSysImageList, small_list); todo_wine ok(shInfow.hIcon == 0, "SHGetFileInfoW(CSIDL_DESKTOP, SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_PIDL) did not clear hIcon\n"); ok(shInfow.szTypeName[0] == 0, "SHGetFileInfoW(CSIDL_DESKTOP, SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_PIDL) did not clear szTypeName[0]\n"); ok(shInfow.iIcon != 0xcfcfcfcf, "SHGetFileInfoW(CSIDL_DESKTOP, SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_PIDL) should set iIcon\n"); ok(shInfow.dwAttributes == 0xcfcfcfcf || shInfoa.dwAttributes == 0, /* Vista */ "SHGetFileInfoW(CSIDL_DESKTOP, SHGFI_SYSICONINDEX|SHGFI_SMALLICON|SHGFI_PIDL) unexpected dwAttributes\n"); - CloseHandle(hSysImageList);
/* Various suposidly invalid flag testing */ memset(&shInfow, 0xcf, sizeof(shInfow)); - hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow), + hSysImageList = (HIMAGELIST)pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow), SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON); - ok(hr != 0, "SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON Failed\n"); + ok(hSysImageList == (HIMAGELIST)small_list, "got %p expect %p\n", hSysImageList, small_list); ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing\n"); ok(shInfow.dwAttributes==0xcfcfcfcf || shInfoa.dwAttributes==0, /* Vista */ @@ -386,8 +433,8 @@ SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON); ok(hr != 0, " SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON Failed\n"); ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing\n"); - ok(shInfow.hIcon!=(HICON)0xcfcfcfcf && shInfow.hIcon!=0,"hIcon invalid\n"); - if (shInfow.hIcon!=(HICON)0xcfcfcfcf) DestroyIcon(shInfow.hIcon); + check_icon_size( shInfow.hIcon, SHGFI_SMALLICON ); + DestroyIcon(shInfow.hIcon); todo_wine ok(shInfow.dwAttributes==0,"dwAttributes not set\n");
memset(&shInfow, 0xcf, sizeof(shInfow)); @@ -395,14 +442,14 @@ SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_LARGEICON); ok(hr != 0, "SHGFI_ICON|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_LARGEICON Failed\n"); ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing\n"); - ok(shInfow.hIcon!=(HICON)0xcfcfcfcf && shInfow.hIcon!=0,"hIcon invalid\n"); - if (shInfow.hIcon != (HICON)0xcfcfcfcf) DestroyIcon(shInfow.hIcon); + check_icon_size( shInfow.hIcon, SHGFI_LARGEICON ); + DestroyIcon( shInfow.hIcon ); todo_wine ok(shInfow.dwAttributes==0,"dwAttributes not set\n");
memset(&shInfow, 0xcf, sizeof(shInfow)); - hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow), + hSysImageList = (HIMAGELIST)pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow), SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_LARGEICON); - ok(hr != 0, "SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_LARGEICON Failed\n"); + ok(hSysImageList == (HIMAGELIST)large_list, "got %p expect %p\n", hSysImageList, small_list); ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing\n"); ok(shInfow.dwAttributes==0xcfcfcfcf || shInfoa.dwAttributes==0, /* Vista */ @@ -430,18 +477,18 @@ ok(shInfow.dwAttributes==0xcfcfcfcf,"dwAttributes modified\n");
memset(&shInfow, 0xcf, sizeof(shInfow)); - hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow), + hSysImageList = (HIMAGELIST)pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow), SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON| SHGFI_ATTRIBUTES); - ok(hr != 0, "SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON|SHGFI_ATTRIBUTES Failed\n"); + ok(hSysImageList == (HIMAGELIST)small_list, "got %p expect %p\n", hSysImageList, small_list); ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing\n"); ok(shInfow.dwAttributes!=0xcfcfcfcf,"dwAttributes not set\n");
memset(&shInfow, 0xcf, sizeof(shInfow)); - hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow), + hSysImageList = (HIMAGELIST)pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow), SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON| SHGFI_EXETYPE); - todo_wine ok(hr != 0, "SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_SMALLICON|SHGFI_EXETYPE Failed\n"); + todo_wine ok(hSysImageList == (HIMAGELIST)small_list, "got %p expect %p\n", hSysImageList, small_list); ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing\n"); ok(shInfow.dwAttributes==0xcfcfcfcf || shInfoa.dwAttributes==0, /* Vista */ @@ -462,17 +509,18 @@ ok(shInfow.dwAttributes!=0xcfcfcfcf,"dwAttributes not set\n");
memset(&shInfow, 0xcf, sizeof(shInfow)); - hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow), + hSysImageList = (HIMAGELIST)pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow), SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL| SHGFI_ATTRIBUTES); + ok(hSysImageList == (HIMAGELIST)large_list, "got %p expect %p\n", hSysImageList, large_list); ok(hr != 0, "SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_ATTRIBUTES Failed\n"); ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing\n"); ok(shInfow.dwAttributes!=0xcfcfcfcf,"dwAttributes not set\n");
memset(&shInfow, 0xcf, sizeof(shInfow)); - hr = pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow), + hSysImageList = (HIMAGELIST)pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow), SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_EXETYPE); - todo_wine ok(hr != 0, "SHGFI_SYSICONINDEX|SHGFI_USEFILEATTRIBUTES|SHGFI_PIDL|SHGFI_EXETYPE Failed\n"); + todo_wine ok(hSysImageList == (HIMAGELIST)large_list, "got %p expect %p\n", hSysImageList, large_list); ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing\n"); ok(shInfow.dwAttributes==0xcfcfcfcf || shInfoa.dwAttributes==0, /* Vista */ @@ -492,7 +540,25 @@ todo_wine ok(shInfow.iIcon==0xcfcfcfcf, "Icon Index Modified\n"); ok(shInfow.dwAttributes!=0xcfcfcfcf,"dwAttributes not set\n");
+ memset(&shInfow, 0xcf, sizeof(shInfow)); + hSysImageList = (HIMAGELIST)pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow), + SHGFI_SYSICONINDEX|SHGFI_PIDL|SHGFI_SMALLICON|SHGFI_SHELLICONSIZE|SHGFI_ICON); + ok(hSysImageList == (HIMAGELIST)small_list, "got %p expect %p\n", hSysImageList, small_list); + ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing\n"); + check_icon_size( shInfow.hIcon, SHGFI_SMALLICON | SHGFI_SHELLICONSIZE ); + DestroyIcon( shInfow.hIcon ); + + memset(&shInfow, 0xcf, sizeof(shInfow)); + hSysImageList = (HIMAGELIST)pSHGetFileInfoW((const WCHAR *)pidList, 0, &shInfow, sizeof(shInfow), + SHGFI_SYSICONINDEX|SHGFI_PIDL|SHGFI_SHELLICONSIZE|SHGFI_ICON); + ok(hSysImageList == (HIMAGELIST)large_list, "got %p expect %p\n", hSysImageList, small_list); + ok(shInfow.iIcon!=0xcfcfcfcf, "Icon Index Missing\n"); + check_icon_size( shInfow.hIcon, SHGFI_LARGEICON | SHGFI_SHELLICONSIZE ); + DestroyIcon( shInfow.hIcon ); + ILFree(pidList); + IImageList_Release( small_list ); + IImageList_Release( large_list ); }
@@ -817,9 +883,10 @@ retval = SHFileOperationA(&shfo); ok(retval == ERROR_CANCELLED || retval == DE_DIFFDIR || /* Vista */ + retval == DE_FILEDESTISFLD || /* Vista, running from c: */ broken(retval == DE_OPCANCELLED) || /* Win9x */ broken(retval == 65652), /* NT4 */ - "Expected ERROR_CANCELLED or DE_DIFFDIR\n"); + "Expected ERROR_CANCELLED or DE_DIFFDIR, got %u\n", retval); ok(file_exists("test1.txt"), "Expected test1.txt to exist\n");
/* pFrom is empty */ @@ -2516,6 +2583,11 @@ skip("Unicode tests skipped on non-unicode system\n"); return; } + if (GetLastError()==ERROR_ACCESS_DENIED) + { + skip("test needs admin rights\n"); + return; + } CloseHandle(file);
/* Try to delete a file with unicode filename */ @@ -2574,6 +2646,7 @@ ok(GetLastError() == ERROR_SUCCESS || broken(GetLastError() == ERROR_INVALID_HANDLE), /* WinXp, win2k3 */ "Expected ERROR_SUCCESS, got %d\n", GetLastError()); + DeleteFileW(UNICODE_PATH_TO);
/* Check last error after a failed file operation. */ DeleteFileW(UNICODE_PATH);
Modified: trunk/rostests/winetests/shell32/shlfolder.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shell32/shlfolde... ============================================================================== --- trunk/rostests/winetests/shell32/shlfolder.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shell32/shlfolder.c [iso-8859-1] Sun Jun 4 01:52:12 2017 @@ -73,9 +73,8 @@ static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL); static UINT (WINAPI *pGetSystemWow64DirectoryW)(LPWSTR, UINT); static HRESULT (WINAPI *pSHCreateDefaultContextMenu)(const DEFCONTEXTMENU*,REFIID,void**); -static HRESULT (WINAPI *pSHCreateShellFolderView)(const SFV_CREATE *pcsfv, IShellView **ppsv); -static HRESULT (WINAPI *pSHCreateShellFolderViewEx)(LPCSFV psvcbi, IShellView **ppv); static HRESULT (WINAPI *pSHILCreateFromPath)(LPCWSTR, LPITEMIDLIST *,DWORD*); +static BOOL (WINAPI *pSHGetPathFromIDListEx)(PCIDLIST_ABSOLUTE,WCHAR*,DWORD,GPFIDL_FLAGS);
static WCHAR *make_wstr(const char *str) { @@ -133,8 +132,7 @@ MAKEFUNC(SHGetIDListFromObject); MAKEFUNC(SHGetItemFromObject); MAKEFUNC(SHCreateDefaultContextMenu); - MAKEFUNC(SHCreateShellFolderView); - MAKEFUNC(SHCreateShellFolderViewEx); + MAKEFUNC(SHGetPathFromIDListEx); #undef MAKEFUNC
#define MAKEFUNC_ORD(f, ord) (p##f = (void*)GetProcAddress(hmod, (LPSTR)(ord))) @@ -452,7 +450,7 @@ flags = ~0u; hr = IShellFolder_GetAttributesOf(iFolder, 1, (LPCITEMIDLIST*)(idlArr + i), &flags); ok(hr == S_OK, "GetAttributesOf returns %08x\n", hr); - ok((flags & ~SFGAO_HASSUBFOLDER) == full_attrs[i], "%d: got %08x expected %08x\n", i, flags, full_attrs[i]); + ok((flags & ~(SFGAO_HASSUBFOLDER|SFGAO_COMPRESSED)) == full_attrs[i], "%d: got %08x expected %08x\n", i, flags, full_attrs[i]); }
for (i=0;i<5;i++) @@ -1347,10 +1345,34 @@
result = pSHGetPathFromIDListW(pidlTestFile, wszPath); ok(result, "SHGetPathFromIDListW failed! Last error: %u\n", GetLastError()); + ok(0 == lstrcmpW(wszFileName, wszPath), "SHGetPathFromIDListW returned incorrect path for file placed on desktop\n"); + + if (pSHGetPathFromIDListEx) + { + result = pSHGetPathFromIDListEx(pidlEmpty, wszPath, MAX_PATH, SFGAO_FILESYSTEM); + ok(result, "SHGetPathFromIDListEx failed: %u\n", GetLastError()); + ok(!lstrcmpiW(wszDesktop, wszPath), "Unexpected SHGetPathFromIDListEx result %s, expected %s\n", + wine_dbgstr_w(wszPath), wine_dbgstr_w(wszDesktop)); + + result = pSHGetPathFromIDListEx(pidlTestFile, wszPath, MAX_PATH, SFGAO_FILESYSTEM); + ok(result, "SHGetPathFromIDListEx failed: %u\n", GetLastError()); + ok(!lstrcmpiW(wszFileName, wszPath), "Unexpected SHGetPathFromIDListEx result %s, expected %s\n", + wine_dbgstr_w(wszPath), wine_dbgstr_w(wszFileName)); + + SetLastError(0xdeadbeef); + memset(wszPath, 0x55, sizeof(wszPath)); + result = pSHGetPathFromIDListEx(pidlTestFile, wszPath, 5, SFGAO_FILESYSTEM); + ok(!result, "SHGetPathFromIDListEx returned: %x(%u)\n", result, GetLastError()); + + SetLastError(0xdeadbeef); + memset(wszPath, 0x55, sizeof(wszPath)); + result = pSHGetPathFromIDListEx(pidlEmpty, wszPath, 5, SFGAO_FILESYSTEM); + ok(!result, "SHGetPathFromIDListEx returned: %x(%u)\n", result, GetLastError()); + } + else + win_skip("SHGetPathFromIDListEx not available\n"); + IMalloc_Free(ppM, pidlTestFile); - if (!result) return; - ok(0 == lstrcmpW(wszFileName, wszPath), "SHGetPathFromIDListW returned incorrect path for file placed on desktop\n"); -
/* Test if we can get the path from the start menu "program files" PIDL. */ hr = pSHGetSpecialFolderLocation(NULL, CSIDL_PROGRAM_FILES, &pidlPrograms); @@ -1358,7 +1380,7 @@
SetLastError(0xdeadbeef); result = pSHGetPathFromIDListW(pidlPrograms, wszPath); - IMalloc_Free(ppM, pidlPrograms); + IMalloc_Free(ppM, pidlPrograms); ok(result, "SHGetPathFromIDListW failed\n"); }
@@ -1588,7 +1610,8 @@ if (hr != S_OK) return;
hr = IShellFolder_GetDisplayNameOf(pShellFolder, NULL, SHGDN_FORPARSING, &strret); - ok(hr == S_OK, "IShellFolder_GetDisplayNameOf(NULL) failed! hr = %08x\n", hr); + ok(hr == S_OK || broken(hr == E_INVALIDARG) /* win10 */, + "IShellFolder_GetDisplayNameOf(NULL) failed! hr = %08x\n", hr); if (hr != S_OK) { IShellFolder_Release(pShellFolder); return; @@ -3773,10 +3796,10 @@ hr = IShellFolder_BindToObject(pdesktopsf, pidl_testdir, NULL, (REFIID)&IID_IShellFolder, (void**)&psf); ok(hr == S_OK, "Got 0x%08x\n", hr); - if(SUCCEEDED(hr)) - pILFree(pidl_testdir); + pILFree(pidl_testdir); } IShellFolder_Release(pdesktopsf); + if (FAILED(hr)) return;
hr = IShellFolder_EnumObjects(psf, NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &peidl); ok(hr == S_OK, "Got %08x\n", hr); @@ -5150,123 +5173,6 @@ IShellFolder_Release(desktop); ILFree(pidl); Cleanup(); -} - -static void test_SHCreateShellFolderView(void) -{ - HRESULT hr; - IShellView *psv; - SFV_CREATE sfvc; - IShellFolder *desktop; - ULONG refCount; - - if (!pSHCreateShellFolderView) - { - win_skip("SHCreateShellFolderView missing.\n"); - return; - } - - hr = SHGetDesktopFolder(&desktop); - ok(hr == S_OK, "got (0x%08x)\n", hr); - - if (0) - { - /* crash on win7 */ - pSHCreateShellFolderView(NULL, NULL); - } - - psv = (void *)0xdeadbeef; - hr = pSHCreateShellFolderView(NULL, &psv); - ok(hr == E_INVALIDARG, "Got 0x%08x\n", hr); - ok(psv == NULL, "psv = %p\n", psv); - - memset(&sfvc, 0, sizeof(sfvc)); - psv = (void *)0xdeadbeef; - hr = pSHCreateShellFolderView(&sfvc, &psv); - ok(hr == E_INVALIDARG, "Got 0x%08x\n", hr); - ok(psv == NULL, "psv = %p\n", psv); - - memset(&sfvc, 0, sizeof(sfvc)); - sfvc.cbSize = sizeof(sfvc) - 1; - psv = (void *)0xdeadbeef; - hr = pSHCreateShellFolderView(&sfvc, &psv); - ok(hr == E_INVALIDARG, "Got 0x%08x\n", hr); - ok(psv == NULL, "psv = %p\n", psv); - - memset(&sfvc, 0, sizeof(sfvc)); - sfvc.cbSize = sizeof(sfvc) + 1; - psv = (void *)0xdeadbeef; - hr = pSHCreateShellFolderView(&sfvc, &psv); - ok(hr == E_INVALIDARG, "Got 0x%08x\n", hr); - ok(psv == NULL, "psv = %p\n", psv); - - memset(&sfvc, 0, sizeof(sfvc)); - sfvc.cbSize = sizeof(sfvc); - sfvc.pshf = desktop; - psv = NULL; - hr = pSHCreateShellFolderView(&sfvc, &psv); - ok(hr == S_OK, "Got 0x%08x\n", hr); - ok(psv != NULL, "psv = %p\n", psv); - if (psv) - { - refCount = IShellView_Release(psv); - ok(refCount == 0, "refCount = %u\n", refCount); - } - - IShellFolder_Release(desktop); -} - -static void test_SHCreateShellFolderViewEx(void) -{ - HRESULT hr; - IShellView *psv; - CSFV csfv; - IShellFolder *desktop; - ULONG refCount; - - if (!pSHCreateShellFolderViewEx) - { - win_skip("SHCreateShellFolderViewEx missing.\n"); - return; - } - - hr = SHGetDesktopFolder(&desktop); - ok(hr == S_OK, "got (0x%08x)\n", hr); - - if (0) - { - /* crash on win7 */ - pSHCreateShellFolderViewEx(NULL, NULL); - pSHCreateShellFolderViewEx(NULL, &psv); - pSHCreateShellFolderViewEx(&csfv, NULL); - } - - memset(&csfv, 0, sizeof(csfv)); - csfv.pshf = desktop; - psv = NULL; - hr = pSHCreateShellFolderViewEx(&csfv, &psv); - ok(hr == S_OK, "Got 0x%08x\n", hr); - ok(psv != NULL, "psv = %p\n", psv); - if (psv) - { - refCount = IShellView_Release(psv); - ok(refCount == 0, "refCount = %u\n", refCount); - } - - memset(&csfv, 0, sizeof(csfv)); - csfv.cbSize = sizeof(csfv); - csfv.pshf = desktop; - psv = NULL; - hr = pSHCreateShellFolderViewEx(&csfv, &psv); - ok(hr == S_OK, "Got 0x%08x\n", hr); - ok(psv != NULL, "psv = %p\n", psv); - if (psv) - { - refCount = IShellView_Release(psv); - ok(refCount == 0, "refCount = %u\n", refCount); - } - - IShellFolder_Release(desktop); }
static void test_DataObject(void) @@ -5364,8 +5270,6 @@ test_ShellItemGetAttributes(); test_ShellItemArrayGetAttributes(); test_SHCreateDefaultContextMenu(); - test_SHCreateShellFolderView(); - test_SHCreateShellFolderViewEx(); test_DataObject();
OleUninitialize();
Modified: trunk/rostests/winetests/shell32/shlview.c URL: http://svn.reactos.org/svn/reactos/trunk/rostests/winetests/shell32/shlview.... ============================================================================== --- trunk/rostests/winetests/shell32/shlview.c [iso-8859-1] (original) +++ trunk/rostests/winetests/shell32/shlview.c [iso-8859-1] Sun Jun 4 01:52:12 2017 @@ -53,10 +53,8 @@ { WNDPROC oldproc = (WNDPROC)GetWindowLongPtrA(hwnd, GWLP_USERDATA); static LONG defwndproc_counter = 0; + struct message msg = { 0 }; LRESULT ret; - struct message msg; - - trace("listview: %p, %04x, %08lx, %08lx\n", hwnd, message, wParam, lParam);
msg.message = message; msg.flags = sent|wparam|lparam; @@ -635,12 +633,18 @@ HRESULT hr; RECT r = {0}; ULONG ref1, ref2; + IUnknown *unk;
hr = SHGetDesktopFolder(&desktop); ok(hr == S_OK, "got (0x%08x)\n", hr);
hr = IShellFolder_CreateViewObject(desktop, NULL, &IID_IShellView, (void**)&view); ok(hr == S_OK, "got (0x%08x)\n", hr); + + hr = IShellView_QueryInterface(view, &IID_CDefView, (void **)&unk); + ok(hr == S_OK, "got (0x%08x)\n", hr); + ok(unk == (IUnknown *)view, "got %p\n", unk); + IUnknown_Release(unk);
if (0) { @@ -1331,6 +1335,147 @@ IShellFolder_Release(psf_desktop); }
+static void test_SHCreateShellFolderView(void) +{ + IShellFolder *desktop; + IShellView *psv; + SFV_CREATE sfvc; + ULONG refCount; + IUnknown *unk; + HRESULT hr; + + hr = SHGetDesktopFolder(&desktop); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + if (0) + { + /* crash on win7 */ + SHCreateShellFolderView(NULL, NULL); + } + + psv = (void *)0xdeadbeef; + hr = SHCreateShellFolderView(NULL, &psv); + ok(hr == E_INVALIDARG, "Got 0x%08x\n", hr); + ok(psv == NULL, "psv = %p\n", psv); + + memset(&sfvc, 0, sizeof(sfvc)); + psv = (void *)0xdeadbeef; + hr = SHCreateShellFolderView(&sfvc, &psv); + ok(hr == E_INVALIDARG, "Got 0x%08x\n", hr); + ok(psv == NULL, "psv = %p\n", psv); + + memset(&sfvc, 0, sizeof(sfvc)); + sfvc.cbSize = sizeof(sfvc) - 1; + psv = (void *)0xdeadbeef; + hr = SHCreateShellFolderView(&sfvc, &psv); + ok(hr == E_INVALIDARG, "Got 0x%08x\n", hr); + ok(psv == NULL, "psv = %p\n", psv); + + memset(&sfvc, 0, sizeof(sfvc)); + sfvc.cbSize = sizeof(sfvc) + 1; + psv = (void *)0xdeadbeef; + hr = SHCreateShellFolderView(&sfvc, &psv); + ok(hr == E_INVALIDARG, "Got 0x%08x\n", hr); + ok(psv == NULL, "psv = %p\n", psv); + +if (0) +{ + /* Crashes on NULL 'pshf' on XP/2k3 */ + memset(&sfvc, 0, sizeof(sfvc)); + sfvc.cbSize = sizeof(sfvc); + psv = (void *)0xdeadbeef; + hr = SHCreateShellFolderView(&sfvc, &psv); + ok(hr == E_UNEXPECTED, "Got 0x%08x\n", hr); + ok(psv == NULL, "psv = %p\n", psv); +} + memset(&sfvc, 0, sizeof(sfvc)); + sfvc.cbSize = sizeof(sfvc) - 1; + sfvc.pshf = desktop; + psv = (void *)0xdeadbeef; + hr = SHCreateShellFolderView(&sfvc, &psv); + ok(hr == E_INVALIDARG, "Got 0x%08x\n", hr); + ok(psv == NULL, "psv = %p\n", psv); + + memset(&sfvc, 0, sizeof(sfvc)); + sfvc.cbSize = sizeof(sfvc); + sfvc.pshf = desktop; + psv = NULL; + hr = SHCreateShellFolderView(&sfvc, &psv); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(psv != NULL, "psv = %p\n", psv); + + hr = IShellView_QueryInterface(psv, &IID_CDefView, (void **)&unk); + ok(hr == S_OK, "got (0x%08x)\n", hr); + ok(unk == (IUnknown *)psv, "got %p\n", unk); + IUnknown_Release(unk); + + refCount = IShellView_Release(psv); + ok(refCount == 0, "refCount = %u\n", refCount); + + IShellFolder_Release(desktop); +} + +static void test_SHCreateShellFolderViewEx(void) +{ + IShellFolder *desktop; + IShellView *psv; + ULONG refCount; + IUnknown *unk; + HRESULT hr; + CSFV csfv; + + hr = SHGetDesktopFolder(&desktop); + ok(hr == S_OK, "got (0x%08x)\n", hr); + + if (0) + { + /* crash on win7 */ + SHCreateShellFolderViewEx(NULL, NULL); + SHCreateShellFolderViewEx(NULL, &psv); + SHCreateShellFolderViewEx(&csfv, NULL); + } + + memset(&csfv, 0, sizeof(csfv)); + csfv.pshf = desktop; + psv = NULL; + hr = SHCreateShellFolderViewEx(&csfv, &psv); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(psv != NULL, "psv = %p\n", psv); + + hr = IShellView_QueryInterface(psv, &IID_CDefView, (void **)&unk); + ok(hr == S_OK, "got (0x%08x)\n", hr); + ok(unk == (IUnknown *)psv, "got %p\n", unk); + IUnknown_Release(unk); + + refCount = IShellView_Release(psv); + ok(refCount == 0, "refCount = %u\n", refCount); + +if (0) +{ + /* Crashes on null shellfolder, on XP/2k3 */ + memset(&csfv, 0, sizeof(csfv)); + csfv.pshf = NULL; + psv = (void *)0xdeadbeef; + hr = SHCreateShellFolderViewEx(&csfv, &psv); + ok(hr == E_UNEXPECTED, "Got 0x%08x\n", hr); + ok(psv == NULL, "psv = %p\n", psv); +} + memset(&csfv, 0, sizeof(csfv)); + csfv.cbSize = sizeof(csfv); + csfv.pshf = desktop; + psv = NULL; + hr = SHCreateShellFolderViewEx(&csfv, &psv); + ok(hr == S_OK, "Got 0x%08x\n", hr); + ok(psv != NULL, "psv = %p\n", psv); + if (psv) + { + refCount = IShellView_Release(psv); + ok(refCount == 0, "refCount = %u\n", refCount); + } + + IShellFolder_Release(desktop); +} + START_TEST(shlview) { OleInitialize(NULL); @@ -1344,6 +1489,8 @@ test_IOleWindow(); test_GetSetCurrentViewMode(); test_IOleCommandTarget(); + test_SHCreateShellFolderView(); + test_SHCreateShellFolderViewEx();
OleUninitialize(); }