SHELL: fixed SHGetFileInfoW
Alberto Massari
alby at exln.com
Sat Oct 26 09:29:07 CDT 2002
This patch fixes:
- typo in SHGetFileInfoA (szLoaction instead of szLocation)
- wrong code in SHGetFileInfoW: this function relies on SHGetFileInfoA, so
it should convert the requested name from Unicode into a multi byte string,
then copy/convert the data returned in the SHFILEINFOA structure into the
caller-supplied SHFILEINFOW structure.
The old code was not returning anything to the caller and, depending on
what was in the provided SHFILEINFOW structure (usually garbage
characters), it could crash trying to convert two strings from Unicode to
multi byte.
Alberto
Index: shell32_main.c
===================================================================
RCS file: /home/wine/wine/dlls/shell32/shell32_main.c,v
retrieving revision 1.102
diff -u -r1.102 shell32_main.c
--- shell32_main.c 23 Oct 2002 20:20:59 -0000 1.102
+++ shell32_main.c 26 Oct 2002 14:24:25 -0000
@@ -209,7 +209,7 @@
SHFILEINFOA *psfi, UINT sizeofpsfi,
UINT flags )
{
- char szLoaction[MAX_PATH];
+ char szLocation[MAX_PATH];
int iIndex;
DWORD ret = TRUE, dwAttributes = 0;
IShellFolder * psfParent = NULL;
@@ -367,11 +367,11 @@
if (SUCCEEDED(hr))
{
- hr = IExtractIconA_GetIconLocation(pei, (flags &
SHGFI_OPENICON)? GIL_OPENICON : 0,szLoaction, MAX_PATH, &iIndex, &uFlags);
+ hr = IExtractIconA_GetIconLocation(pei, (flags &
SHGFI_OPENICON)? GIL_OPENICON : 0,szLocation, MAX_PATH, &iIndex, &uFlags);
/* FIXME what to do with the index? */
if(uFlags != GIL_NOTFILENAME)
- strcpy (psfi->szDisplayName, szLoaction);
+ strcpy (psfi->szDisplayName, szLocation);
else
ret = FALSE;
@@ -466,12 +466,21 @@
temppath = HeapAlloc(GetProcessHeap(), 0, len);
WideCharToMultiByte(CP_ACP, 0, path, -1, temppath, len, NULL, NULL);
- WideCharToMultiByte(CP_ACP, 0, psfi->szDisplayName, -1,
temppsfi.szDisplayName,
- sizeof(temppsfi.szDisplayName), NULL, NULL);
- WideCharToMultiByte(CP_ACP, 0, psfi->szTypeName, -1,
temppsfi.szTypeName,
- sizeof(temppsfi.szTypeName), NULL, NULL);
+ if(flags & SHGFI_ATTR_SPECIFIED)
+ temppsfi.dwAttributes=psfi->dwAttributes;
ret = SHGetFileInfoA(temppath, dwFileAttributes, &temppsfi,
sizeof(temppsfi), flags);
+
+ 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))
+ MultiByteToWideChar(CP_ACP, 0, temppsfi.szDisplayName, -1,
psfi->szDisplayName, sizeof(psfi->szDisplayName));
+ if(flags & SHGFI_TYPENAME)
+ MultiByteToWideChar(CP_ACP, 0, temppsfi.szTypeName, -1,
psfi->szTypeName, sizeof(psfi->szTypeName));
HeapFree(GetProcessHeap(), 0, temppath);
More information about the wine-patches
mailing list