For the record, the commit doesn't match our contributing rules and should be avoided in the future. Reference: https://github.com/reactos/reactos/blob/master/.gitmessage
Le 16/02/2018 à 12:00, Katayama Hirofumi MZ a écrit :
https://git.reactos.org/?p=reactos.git;a=commitdiff;h=338799bf8bf98698f3e4c1...
commit 338799bf8bf98698f3e4c1c2b885d724a9a929da Author: Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com AuthorDate: Fri Feb 16 20:00:08 2018 +0900 Commit: Ged Murphy gedmurphy@reactos.org CommitDate: Fri Feb 16 11:00:08 2018 +0000
improve SHGetFileInfo (#118) This patch reduces failures of SHGetFileInfo function. CORE-7159 * improve WideByteToWideChar calls * fix bugs related to file attributes and SHGFI_EXETYPE * SHGFI_USEFILEATTRIBUTES and SHGFI_ICON fix * s/sizeof(temppsfi)/0/
dll/win32/shell32/wine/shell32_main.c | 81 +++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 32 deletions(-)
diff --git a/dll/win32/shell32/wine/shell32_main.c b/dll/win32/shell32/wine/shell32_main.c index b5638f0582..e64ef7f6fb 100644 --- a/dll/win32/shell32/wine/shell32_main.c +++ b/dll/win32/shell32/wine/shell32_main.c @@ -3,6 +3,7 @@
- Copyright 1998 Marcus Meissner
- Copyright 1998 Juergen Schmied (jsch) * juergen.schmied@metronet.de
- Copyright 2017 Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
@@ -433,7 +434,7 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes, { psfi->szDisplayName[0] = '\0'; psfi->szTypeName[0] = '\0';
psfi->iIcon = 0;
psfi->hIcon = NULL;}
if (!(flags & SHGFI_PIDL))
@@ -449,12 +450,24 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes, 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)){if (flags & SHGFI_USEFILEATTRIBUTES){return TRUE;}else if (GetFileAttributesW(szFullPath) != INVALID_FILE_ATTRIBUTES){return shgfi_get_exe_type(szFullPath);}}}
/*
@@ -488,6 +501,8 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes, (LPCITEMIDLIST*)&pidlLast ); if (SUCCEEDED(hr)) pidlLast = ILClone(pidlLast);
elsehr = S_OK; ILFree(pidl); } else@@ -505,8 +520,18 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes, psfi->dwAttributes = 0xffffffff; } if (psfParent)
IShellFolder_GetAttributesOf( psfParent, 1, (LPCITEMIDLIST*)&pidlLast,&(psfi->dwAttributes) );
{IShellFolder_GetAttributesOf(psfParent, 1, (LPCITEMIDLIST*)&pidlLast,&(psfi->dwAttributes));}}
if (flags & SHGFI_USEFILEATTRIBUTES)
{
if (flags & SHGFI_ICON){psfi->dwAttributes = 0;}}
/* get the displayname */
@@ -516,7 +541,7 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes, { lstrcpyW (psfi->szDisplayName, PathFindFileNameW(szFullPath)); }
else
else if (psfParent) { STRRET str; hr = IShellFolder_GetDisplayNameOf( psfParent, pidlLast,@@ -618,7 +643,7 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes, ret = FALSE; } }
else
else if (psfParent) { hr = IShellFolder_GetUIObjectOf(psfParent, 0, 1, (LPCITEMIDLIST*)&pidlLast, &IID_IExtractIconW,@@ -694,7 +719,7 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes, } } }
else
else if (psfParent) { if (!(PidlToSicIndex(psfParent, pidlLast, !(flags & SHGFI_SMALLICON), uGilFlags, &(psfi->iIcon))))@@ -769,33 +794,25 @@ DWORD_PTR WINAPI SHGetFileInfoA(LPCSTR path,DWORD dwFileAttributes, 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, 0, flags);- else ret = SHGetFileInfoW(pathW, dwFileAttributes, &temppsfi, sizeof(temppsfi), flags);
psfi->hIcon = temppsfi.hIcon;psfi->iIcon = temppsfi.iIcon;psfi->dwAttributes = temppsfi.dwAttributes;
- 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);}
WideCharToMultiByte(CP_ACP, 0, temppsfi.szDisplayName, -1,psfi->szDisplayName, sizeof(psfi->szDisplayName), NULL, NULL);WideCharToMultiByte(CP_ACP, 0, temppsfi.szTypeName, -1,psfi->szTypeName, sizeof(psfi->szTypeName), NULL, NULL);}
else
ret = SHGetFileInfoW(pathW, dwFileAttributes, NULL, 0, flags);HeapFree(GetProcessHeap(), 0, temppath);