Index: dll/win32/shell32/shell32_main.cpp =================================================================== --- dll/win32/shell32/shell32_main.cpp (revision 58848) +++ dll/win32/shell32/shell32_main.cpp (working copy) @@ -342,9 +342,9 @@ /* windows initializes these values regardless of the flags */ if (psfi != NULL) { + psfi->hIcon = NULL; psfi->szDisplayName[0] = '\0'; psfi->szTypeName[0] = '\0'; - psfi->iIcon = 0; } if (!(flags & SHGFI_PIDL)) @@ -360,12 +360,15 @@ lstrcpynW(szFullPath, path, MAX_PATH); } } + else + { + SHGetPathFromIDListW((LPITEMIDLIST)path, szFullPath); + } if (flags & SHGFI_EXETYPE) { - if (flags != SHGFI_EXETYPE) - return 0; - return shgfi_get_exe_type(szFullPath); + if (!(flags & SHGFI_SYSICONINDEX) && GetFileAttributesW(szFullPath) != 0xFFFFFFFF) + return shgfi_get_exe_type(szFullPath); } /* @@ -399,6 +402,8 @@ (LPCITEMIDLIST*)&pidlLast ); if (SUCCEEDED(hr)) pidlLast = ILClone(pidlLast); + else + hr = S_OK; ILFree(pidl); } else @@ -417,7 +422,7 @@ } if (psfParent != NULL) psfParent->GetAttributesOf(1, (LPCITEMIDLIST*)&pidlLast, - &(psfi->dwAttributes) ); + &(psfi->dwAttributes)); } /* get the displayname */ @@ -427,7 +432,7 @@ { wcscpy (psfi->szDisplayName, PathFindFileNameW(szFullPath)); } - else + else if (psfParent != NULL) { STRRET str; hr = psfParent->GetDisplayNameOf(pidlLast, @@ -475,7 +480,7 @@ if (flags & SHGFI_LINKOVERLAY) uGilFlags |= GIL_FORSHORTCUT; else if ((flags&SHGFI_ADDOVERLAYS) || - (flags&(SHGFI_ICON|SHGFI_SMALLICON))==SHGFI_ICON) + (flags&(SHGFI_ICON|SHGFI_SMALLICON)) == SHGFI_ICON) { if (SHELL_IsShortcut(pidlLast)) uGilFlags |= GIL_FORSHORTCUT; @@ -526,7 +531,7 @@ ret = FALSE; } } - else + else if (psfParent != NULL) { hr = psfParent->GetUIObjectOf(0, 1, (LPCITEMIDLIST*)&pidlLast, IID_IExtractIconW, @@ -602,7 +607,7 @@ } } } - else + else if (psfParent) { if (!(PidlToSicIndex(psfParent, pidlLast, !(flags & SHGFI_SMALLICON), uGilFlags, &(psfi->iIcon)))) @@ -676,33 +681,28 @@ pathW = temppath; } - if (psfi && (flags & SHGFI_ATTR_SPECIFIED)) - temppsfi.dwAttributes=psfi->dwAttributes; + if (psfi) + { + temppsfi.hIcon = psfi->hIcon; + temppsfi.iIcon = psfi->iIcon; + temppsfi.dwAttributes = psfi->dwAttributes; - if (psfi == NULL) - ret = SHGetFileInfoW(pathW, dwFileAttributes, NULL, sizeof(temppsfi), flags); - else ret = SHGetFileInfoW(pathW, dwFileAttributes, &temppsfi, sizeof(temppsfi), flags); - if (psfi) - { - if(flags & SHGFI_ICON) - psfi->hIcon=temppsfi.hIcon; - if(flags & (SHGFI_SYSICONINDEX|SHGFI_ICON|SHGFI_ICONLOCATION)) - psfi->iIcon=temppsfi.iIcon; - if(flags & SHGFI_ATTRIBUTES) - psfi->dwAttributes=temppsfi.dwAttributes; - if(flags & (SHGFI_DISPLAYNAME|SHGFI_ICONLOCATION)) - { - WideCharToMultiByte(CP_ACP, 0, temppsfi.szDisplayName, -1, - psfi->szDisplayName, sizeof(psfi->szDisplayName), NULL, NULL); - } - if(flags & SHGFI_TYPENAME) - { - WideCharToMultiByte(CP_ACP, 0, temppsfi.szTypeName, -1, - psfi->szTypeName, sizeof(psfi->szTypeName), NULL, NULL); - } + psfi->hIcon = temppsfi.hIcon; + psfi->iIcon = temppsfi.iIcon; + psfi->dwAttributes = temppsfi.dwAttributes; + + len = lstrlenW(temppsfi.szDisplayName); + WideCharToMultiByte(CP_ACP, 0, temppsfi.szDisplayName, len + 1, + psfi->szDisplayName, len + 1, NULL, NULL); + + len = lstrlenW(temppsfi.szTypeName); + WideCharToMultiByte(CP_ACP, 0, temppsfi.szTypeName, len + 1, + psfi->szTypeName, sizeof(psfi->szTypeName), NULL, NULL); } + else + ret = SHGetFileInfoW(pathW, dwFileAttributes, NULL, sizeof(temppsfi), flags); HeapFree(GetProcessHeap(), 0, temppath);