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/CMakeLi…
==============================================================================
--- 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/ebrowse…
==============================================================================
--- 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/shelldi…
==============================================================================
--- 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/shellli…
==============================================================================
--- 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/shellol…
==============================================================================
--- 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/shellpa…
==============================================================================
--- 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_…
==============================================================================
--- 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/shlfile…
==============================================================================
--- 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/shlfold…
==============================================================================
--- 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();
}