From: Michael Müller michael@fds-team.de
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=24851 --- dlls/shell32/shlfolder.c | 18 +++++++++++++++++- dlls/shell32/tests/shlfolder.c | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-)
diff --git a/dlls/shell32/shlfolder.c b/dlls/shell32/shlfolder.c index 31016a3dbe6..ea44f862222 100644 --- a/dlls/shell32/shlfolder.c +++ b/dlls/shell32/shlfolder.c @@ -437,7 +437,23 @@ HRESULT SHELL32_GetItemAttributes (IShellFolder2 *psf, LPCITEMIDLIST pidl, LPDWO SFGAO_CANRENAME | SFGAO_CANLINK | SFGAO_CANMOVE | SFGAO_CANCOPY;
if (file_attr & FILE_ATTRIBUTE_DIRECTORY) - *pdwAttributes |= (SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_FILESYSANCESTOR | SFGAO_STORAGEANCESTOR | SFGAO_STORAGE); + { + IEnumIDList *enum_ids; + IShellFolder *child; + + *pdwAttributes |= (SFGAO_FOLDER | SFGAO_FILESYSANCESTOR | SFGAO_STORAGEANCESTOR | SFGAO_STORAGE); + + if (SUCCEEDED(IShellFolder2_BindToObject(psf, pidl, NULL, &IID_IShellFolder, (void **)&child))) + { + if (IShellFolder_EnumObjects(child, NULL, SHCONTF_FOLDERS|SHCONTF_INCLUDEHIDDEN, &enum_ids) == S_OK) + { + if (IEnumIDList_Skip(enum_ids, 1) != S_OK) + *pdwAttributes &= ~SFGAO_HASSUBFOLDER; + IEnumIDList_Release(enum_ids); + } + IShellFolder_Release(child); + } + } else { *pdwAttributes &= ~(SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_FILESYSANCESTOR | SFGAO_STORAGEANCESTOR | SFGAO_STORAGE); diff --git a/dlls/shell32/tests/shlfolder.c b/dlls/shell32/tests/shlfolder.c index 2976da9089d..6535f70f0f7 100644 --- a/dlls/shell32/tests/shlfolder.c +++ b/dlls/shell32/tests/shlfolder.c @@ -1160,7 +1160,7 @@ static void test_GetAttributesOf(void) dwFlags = ~0u; hr = IShellFolder_GetAttributesOf(testIShellFolder, 1, (LPCITEMIDLIST *)&pidls[1], &dwFlags); ok(hr == S_OK, "got hr %#lx\n", hr); - todo_wine ok(dwFlags == (testdir_flags & ~SFGAO_HASSUBFOLDER), "got flags %#lx\n", dwFlags); + ok(dwFlags == (testdir_flags & ~SFGAO_HASSUBFOLDER), "got flags %#lx\n", dwFlags);
/* Test an absolute PIDL. Results for ParseDisplayName() are the same as * the relative PIDL, but for GetAttributesOf() they are different. */