[SHELL32_WINETEST] Sync with Wine Staging 2.9. CORE-13362
authorAmine Khaldi <amine.khaldi@reactos.org>
Sun, 4 Jun 2017 01:52:12 +0000 (01:52 +0000)
committerAmine Khaldi <amine.khaldi@reactos.org>
Sun, 4 Jun 2017 01:52:12 +0000 (01:52 +0000)
svn path=/trunk/; revision=74889

rostests/winetests/shell32/CMakeLists.txt
rostests/winetests/shell32/ebrowser.c
rostests/winetests/shell32/shelldispatch.c
rostests/winetests/shell32/shelllink.c
rostests/winetests/shell32/shellole.c
rostests/winetests/shell32/shellpath.c
rostests/winetests/shell32/shfldr_special.c
rostests/winetests/shell32/shlfileop.c
rostests/winetests/shell32/shlfolder.c
rostests/winetests/shell32/shlview.c

index 1f3bfdc..47b0397 100644 (file)
@@ -27,7 +27,7 @@ list(APPEND SOURCE
 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)
index 56d20dc..7db5842 100644 (file)
@@ -71,6 +71,10 @@ DEFINE_GUID(IID_UnknownInterface17,   0x3d5d8c60, 0x21e4, 0x4b03, 0x83,0xb8, 0xc
 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 @@ static void test_QueryInterface(void)
     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 @@ static void test_SetSite(void)
         { &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 },
index 443128f..04f664c 100644 (file)
@@ -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)
 
@@ -37,6 +39,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)
 {
     HMODULE hshell32, hkernel32;
@@ -52,6 +57,48 @@ static void init_function_pointers(void)
 
 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 @@ static void test_namespace(void)
     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);
@@ -86,6 +133,21 @@ static void test_namespace(void)
     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;
     folder = (void*)0xdeadbeef;
@@ -93,6 +155,8 @@ static void test_namespace(void)
     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 @@ static void test_items(void)
     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 @@ static void test_items(void)
         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 @@ static void test_ShellFolderViewDual(void)
         &IID_IShellDispatch5,
         &IID_IShellDispatch4,
         &IID_IShellDispatch2,
+        &IID_IWin7ShellDispatch6,
         &IID_NULL
     };
     IShellFolderViewDual *viewdual;
index 8af3c97..050c033 100755 (executable)
 #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 */
 #endif
@@ -43,6 +46,7 @@ static HRESULT (WINAPI *pSHGetStockIconInfo)(SHSTOCKICONID, UINT, SHSTOCKICONINF
 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 @@ static void test_propertystore(void)
     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 @@ START_TEST(shelllink)
     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 @@ START_TEST(shelllink)
     test_SHGetStockIconInfo();
     test_SHExtractIcons();
     test_propertystore();
+    test_ExtractIcon();
+    test_ExtractAssociatedIcon();
+    test_SHGetImageList();
 
     CoUninitialize();
 }
index df50e2b..eedbdf6 100644 (file)
@@ -866,7 +866,7 @@ static void test_SHCreateSessionKey(void)
 
     if (!pSHCreateSessionKey)
     {
-        skip("SHCreateSessionKey is not implemented\n");
+        win_skip("SHCreateSessionKey is not implemented\n");
         return;
     }
 
@@ -889,12 +889,38 @@ static void test_SHCreateSessionKey(void)
     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();
 }
index 33f3c8f..3292c54 100644 (file)
@@ -808,7 +808,7 @@ static void test_NonExistentPath(void)
                 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 @@ static void test_NonExistentPath(void)
                 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 @@ if (0) { /* crashes */
     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 check_known_folder(IKnownFolderManager *mgr, KNOWNFOLDERID *folderId
 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 @@ static void test_knownFolders(void)
         }
 
         hr = IKnownFolderManager_GetFolderByName(mgr, sWindows, &folder);
-        todo_wine
         ok(hr == S_OK, "failed to get known folder: 0x%08x\n", hr);
         if(SUCCEEDED(hr))
         {
@@ -2154,6 +2156,23 @@ static void test_knownFolders(void)
             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;
 
index 6d61220..dd4cc04 100644 (file)
@@ -166,7 +166,7 @@ if (0)
 
     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 */
index 7b8b48c..0f44082 100644 (file)
 #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
 #endif
@@ -315,6 +319,37 @@ static void test_get_file_info(void)
     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 @@ static void test_get_file_info_iconlist(void)
     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 @@ static void test_get_file_info_iconlist(void)
          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 @@ static void test_get_file_info_iconlist(void)
        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 @@ static void test_get_file_info_iconlist(void)
         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 @@ static void test_get_file_info_iconlist(void)
            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 @@ static void test_get_file_info_iconlist(void)
            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 @@ static void test_get_file_info_iconlist(void)
     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 @@ static void test_get_file_info_iconlist(void)
     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 @@ static void test_get_file_info_iconlist(void)
     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 @@ static void test_rename(void)
     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 @@ static void test_unicode(void)
         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 @@ static void test_unicode(void)
     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);
index 8f62a48..27a2a40 100644 (file)
@@ -73,9 +73,8 @@ static HRESULT (WINAPI *pSHGetItemFromObject)(IUnknown*,REFIID,void**);
 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 @@ static void init_function_pointers(void)
     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 @@ static void test_EnumObjects(IShellFolder *iFolder)
         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 @@ static void test_SHGetPathFromIDList(void)
 
     result = pSHGetPathFromIDListW(pidlTestFile, wszPath);
     ok(result, "SHGetPathFromIDListW failed! Last error: %u\n", GetLastError());
-    IMalloc_Free(ppM, pidlTestFile);
-    if (!result) return;
     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);
 
     /* 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 @@ static void test_SHGetPathFromIDList(void)
 
     SetLastError(0xdeadbeef);
     result = pSHGetPathFromIDListW(pidlPrograms, wszPath);
-       IMalloc_Free(ppM, pidlPrograms);
+    IMalloc_Free(ppM, pidlPrograms);
     ok(result, "SHGetPathFromIDListW failed\n");
 }
 
@@ -1588,7 +1610,8 @@ static void test_FolderShortcut(void) {
     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 @@ static void test_ShellItemArrayEnumItems(void)
         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);
@@ -5152,123 +5175,6 @@ static void test_SHCreateDefaultContextMenu(void)
     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)
 {
     IShellFolder *desktop;
@@ -5364,8 +5270,6 @@ START_TEST(shlfolder)
     test_ShellItemGetAttributes();
     test_ShellItemArrayGetAttributes();
     test_SHCreateDefaultContextMenu();
-    test_SHCreateShellFolderView();
-    test_SHCreateShellFolderViewEx();
     test_DataObject();
 
     OleUninitialize();
index 2c683e3..7685506 100644 (file)
@@ -53,10 +53,8 @@ static LRESULT WINAPI listview_subclass_proc(HWND hwnd, UINT message, WPARAM wPa
 {
     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,6 +633,7 @@ static void test_CreateViewWindow(void)
     HRESULT hr;
     RECT r = {0};
     ULONG ref1, ref2;
+    IUnknown *unk;
 
     hr = SHGetDesktopFolder(&desktop);
     ok(hr == S_OK, "got (0x%08x)\n", hr);
@@ -642,6 +641,11 @@ static void test_CreateViewWindow(void)
     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)
 {
     /* crashes on native */
@@ -1331,6 +1335,147 @@ static void test_IOleCommandTarget(void)
     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 @@ START_TEST(shlview)
     test_IOleWindow();
     test_GetSetCurrentViewMode();
     test_IOleCommandTarget();
+    test_SHCreateShellFolderView();
+    test_SHCreateShellFolderViewEx();
 
     OleUninitialize();
 }