[SHELL32] Make some PIDL (_IL*) functions Unicode (#7018)

There were encoding problems due to non-
Unicode functions.
JIRA issue: CORE-19653
- Adapt _ILGetDrive, _ILGetExtension,
  _ILGetFileAttributes, _ILGetFileDate,
  _ILGetFileSize, and _ILGetFileType
  functions to Unicode.
- Adapt SHELL_IsShortcut and
  SHGetFileInfoW functions to Unicode.
- Delete useless _ILSimpleGetText
  function.
This commit is contained in:
Katayama Hirofumi MZ 2024-06-19 04:32:40 +09:00 committed by GitHub
parent 91af99323f
commit 55898a7ffd
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 78 additions and 175 deletions

View file

@ -57,13 +57,13 @@ static int iDriveTypeIds[7] = { IDS_DRIVE_FIXED, /* DRIVE_UNKNOWN */
BOOL _ILGetDriveType(LPCITEMIDLIST pidl) BOOL _ILGetDriveType(LPCITEMIDLIST pidl)
{ {
char szDrive[8]; WCHAR szDrive[8];
if (!_ILGetDrive(pidl, szDrive, _countof(szDrive))) if (!_ILGetDrive(pidl, szDrive, _countof(szDrive)))
{ {
ERR("pidl %p is not a drive\n", pidl); ERR("pidl %p is not a drive\n", pidl);
return DRIVE_UNKNOWN; return DRIVE_UNKNOWN;
} }
return ::GetDriveTypeA(szDrive); return ::GetDriveTypeW(szDrive);
} }
/*********************************************************************** /***********************************************************************
@ -285,16 +285,16 @@ HRESULT CALLBACK DrivesContextMenuCallback(IShellFolder *psf,
if (FAILED_UNEXPECTEDLY(hr)) if (FAILED_UNEXPECTEDLY(hr))
return hr; return hr;
char szDrive[8] = {0}; WCHAR szDrive[8] = {0};
if (!_ILGetDrive(apidl[0], szDrive, sizeof(szDrive))) if (!_ILGetDrive(apidl[0], szDrive, _countof(szDrive)))
{ {
ERR("pidl is not a drive\n"); ERR("pidl is not a drive\n");
SHFree(pidlFolder); SHFree(pidlFolder);
_ILFreeaPidl(apidl, cidl); _ILFreeaPidl(apidl, cidl);
return E_FAIL; return E_FAIL;
} }
nDriveType = GetDriveTypeA(szDrive); nDriveType = GetDriveTypeW(szDrive);
GetVolumeInformationA(szDrive, NULL, 0, NULL, NULL, &dwFlags, NULL, 0); GetVolumeInformationW(szDrive, NULL, 0, NULL, NULL, &dwFlags, NULL, 0);
// custom command IDs // custom command IDs
#if 0 // Disabled until our menu building system is fixed #if 0 // Disabled until our menu building system is fixed

View file

@ -657,9 +657,9 @@ HRESULT SHELL32_GetFSItemAttributes(IShellFolder * psf, LPCITEMIDLIST pidl, LPDW
if (SFGAO_LINK & *pdwAttributes) if (SFGAO_LINK & *pdwAttributes)
{ {
char ext[MAX_PATH]; WCHAR ext[MAX_PATH];
if (_ILGetExtension(pidl, ext, MAX_PATH) && !lstrcmpiA(ext, "lnk")) if (_ILGetExtension(pidl, ext, _countof(ext)) && !lstrcmpiW(ext, L"lnk"))
dwShellAttributes |= SFGAO_LINK; dwShellAttributes |= SFGAO_LINK;
} }
@ -1598,7 +1598,8 @@ HRESULT WINAPI CFSFolder::GetDetailsOf(PCUITEMID_CHILD pidl,
else else
{ {
hr = S_OK; hr = S_OK;
psd->str.uType = STRRET_CSTR; psd->str.uType = STRRET_WSTR;
psd->str.pOleStr = (LPWSTR)CoTaskMemAlloc(MAX_PATH * sizeof(WCHAR));
/* the data from the pidl */ /* the data from the pidl */
switch (iColumn) switch (iColumn)
{ {
@ -1606,19 +1607,19 @@ HRESULT WINAPI CFSFolder::GetDetailsOf(PCUITEMID_CHILD pidl,
hr = GetDisplayNameOf (pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str); hr = GetDisplayNameOf (pidl, SHGDN_NORMAL | SHGDN_INFOLDER, &psd->str);
break; break;
case SHFSF_COL_SIZE: case SHFSF_COL_SIZE:
_ILGetFileSize(pidl, psd->str.cStr, MAX_PATH); _ILGetFileSize(pidl, psd->str.pOleStr, MAX_PATH);
break; break;
case SHFSF_COL_TYPE: case SHFSF_COL_TYPE:
_ILGetFileType(pidl, psd->str.cStr, MAX_PATH); _ILGetFileType(pidl, psd->str.pOleStr, MAX_PATH);
break; break;
case SHFSF_COL_MDATE: case SHFSF_COL_MDATE:
_ILGetFileDate(pidl, psd->str.cStr, MAX_PATH); _ILGetFileDate(pidl, psd->str.pOleStr, MAX_PATH);
break; break;
case SHFSF_COL_FATTS: case SHFSF_COL_FATTS:
_ILGetFileAttributes(pidl, psd->str.cStr, MAX_PATH); _ILGetFileAttributes(pidl, psd->str.pOleStr, MAX_PATH);
break; break;
case SHFSF_COL_COMMENT: case SHFSF_COL_COMMENT:
psd->str.cStr[0] = '\0'; // TODO: Extract comment from .lnk files? desktop.ini? psd->str.pOleStr[0] = UNICODE_NULL; // TODO: Extract comment from .lnk files? desktop.ini?
break; break;
#if DBG #if DBG
default: default:

View file

@ -1855,13 +1855,11 @@ LPITEMIDLIST _ILCreateDrive(LPCWSTR lpszNew)
pidlOut = _ILAlloc(PT_DRIVE, sizeof(DriveStruct)); pidlOut = _ILAlloc(PT_DRIVE, sizeof(DriveStruct));
if (pidlOut) if (pidlOut)
{ {
LPSTR pszDest; LPSTR pszDest = _ILGetTextPointer(pidlOut);
pszDest = _ILGetTextPointer(pidlOut);
if (pszDest) if (pszDest)
{ {
strcpy(pszDest, "x:\\"); lstrcpyA(pszDest, "x:\\");
pszDest[0]=toupperW(lpszNew[0]); pszDest[0] = toupper(lpszNew[0]);
TRACE("-- create Drive: %s\n", debugstr_a(pszDest)); TRACE("-- create Drive: %s\n", debugstr_a(pszDest));
} }
} }
@ -1893,7 +1891,7 @@ LPITEMIDLIST _ILCreateEntireNetwork(void)
* RETURNS * RETURNS
* strlen (lpszText) * strlen (lpszText)
*/ */
DWORD _ILGetDrive(LPCITEMIDLIST pidl,LPSTR pOut, UINT uSize) DWORD _ILGetDrive(LPCITEMIDLIST pidl, LPWSTR pOut, UINT uSize)
{ {
TRACE("(%p,%p,%u)\n",pidl,pOut,uSize); TRACE("(%p,%p,%u)\n",pidl,pOut,uSize);
@ -1901,7 +1899,7 @@ DWORD _ILGetDrive(LPCITEMIDLIST pidl,LPSTR pOut, UINT uSize)
pidl = ILGetNext(pidl); pidl = ILGetNext(pidl);
if (pidl && _ILIsDrive(pidl)) if (pidl && _ILIsDrive(pidl))
return _ILSimpleGetText(pidl, pOut, uSize); return _ILSimpleGetTextW(pidl, pOut, uSize);
return 0; return 0;
} }
@ -2066,79 +2064,7 @@ BOOL _ILIsPidlSimple(LPCITEMIDLIST pidl)
* ### 3. section getting values from pidls ### * ### 3. section getting values from pidls ###
*/ */
/************************************************************************** /**************************************************************************
* _ILSimpleGetText
*
* gets the text for the first item in the pidl (eg. simple pidl)
*
* returns the length of the string
*/
DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR szOut, UINT uOutSize)
{
DWORD dwReturn=0;
LPSTR szSrc;
LPWSTR szSrcW;
GUID const * riid;
char szTemp[MAX_PATH];
TRACE("(%p %p %x)\n",pidl,szOut,uOutSize);
if (!pidl)
return 0;
if (szOut)
*szOut = 0;
if (_ILIsDesktop(pidl))
{
/* desktop */
if (HCR_GetClassNameA(&CLSID_ShellDesktop, szTemp, MAX_PATH))
{
if (szOut)
lstrcpynA(szOut, szTemp, uOutSize);
dwReturn = strlen (szTemp);
}
}
else if (( szSrc = _ILGetTextPointer(pidl) ))
{
/* filesystem */
if (szOut)
lstrcpynA(szOut, szSrc, uOutSize);
dwReturn = strlen(szSrc);
}
else if (( szSrcW = _ILGetTextPointerW(pidl) ))
{
/* unicode filesystem */
WideCharToMultiByte(CP_ACP,0,szSrcW, -1, szTemp, MAX_PATH, NULL, NULL);
if (szOut)
lstrcpynA(szOut, szTemp, uOutSize);
dwReturn = strlen (szTemp);
}
else if (( riid = _ILGetGUIDPointer(pidl) ))
{
/* special folder */
if ( HCR_GetClassNameA(riid, szTemp, MAX_PATH) )
{
if (szOut)
lstrcpynA(szOut, szTemp, uOutSize);
dwReturn = strlen (szTemp);
}
}
else
{
ERR("-- no text\n");
}
TRACE("-- (%p=%s 0x%08x)\n",szOut,debugstr_a(szOut),dwReturn);
return dwReturn;
}
/**************************************************************************
* _ILSimpleGetTextW * _ILSimpleGetTextW
* *
* gets the text for the first item in the pidl (eg. simple pidl) * gets the text for the first item in the pidl (eg. simple pidl)
@ -2171,7 +2097,7 @@ DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
if (_ILIsDesktop(pidl)) if (_ILIsDesktop(pidl))
{ {
/* desktop */ /* desktop */
if (HCR_GetClassNameW(&CLSID_ShellDesktop, szTemp, MAX_PATH)) if (HCR_GetClassNameW(&CLSID_ShellDesktop, szTemp, _countof(szTemp)))
{ {
if (szOut) if (szOut)
lstrcpynW(szOut, szTemp, uOutSize); lstrcpynW(szOut, szTemp, uOutSize);
@ -2190,7 +2116,7 @@ DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
else if (( szSrc = _ILGetTextPointer(pidl) )) else if (( szSrc = _ILGetTextPointer(pidl) ))
{ {
/* filesystem */ /* filesystem */
MultiByteToWideChar(CP_ACP, 0, szSrc, -1, szTemp, MAX_PATH); MultiByteToWideChar(CP_ACP, 0, szSrc, -1, szTemp, _countof(szTemp));
if (szOut) if (szOut)
lstrcpynW(szOut, szTemp, uOutSize); lstrcpynW(szOut, szTemp, uOutSize);
@ -2200,7 +2126,7 @@ DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR szOut, UINT uOutSize)
else if (( riid = _ILGetGUIDPointer(pidl) )) else if (( riid = _ILGetGUIDPointer(pidl) ))
{ {
/* special folder */ /* special folder */
if ( HCR_GetClassNameW(riid, szTemp, MAX_PATH) ) if ( HCR_GetClassNameW(riid, szTemp, _countof(szTemp)))
{ {
if (szOut) if (szOut)
lstrcpynW(szOut, szTemp, uOutSize); lstrcpynW(szOut, szTemp, uOutSize);
@ -2460,7 +2386,7 @@ BOOL _ILGetFileDateTime(LPCITEMIDLIST pidl, FILETIME *pFt)
return TRUE; return TRUE;
} }
BOOL _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) BOOL _ILGetFileDate(LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize)
{ {
FILETIME ft,lft; FILETIME ft,lft;
SYSTEMTIME time; SYSTEMTIME time;
@ -2471,17 +2397,17 @@ BOOL _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
FileTimeToLocalFileTime(&ft, &lft); FileTimeToLocalFileTime(&ft, &lft);
FileTimeToSystemTime (&lft, &time); FileTimeToSystemTime (&lft, &time);
ret = GetDateFormatA(LOCALE_USER_DEFAULT,DATE_SHORTDATE,&time, NULL, pOut, uOutSize); ret = GetDateFormatW(LOCALE_USER_DEFAULT, DATE_SHORTDATE, &time, NULL, pOut, uOutSize);
if (ret) if (ret)
{ {
/* Append space + time without seconds */ /* Append space + time without seconds */
pOut[ret-1] = ' '; pOut[ret - 1] = L' ';
GetTimeFormatA(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &time, NULL, &pOut[ret], uOutSize - ret); GetTimeFormatW(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &time, NULL, &pOut[ret], uOutSize - ret);
} }
} }
else else
{ {
pOut[0] = '\0'; pOut[0] = UNICODE_NULL;
ret = FALSE; ret = FALSE;
} }
return ret; return ret;
@ -2504,7 +2430,7 @@ BOOL _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
* pOut can be null when no string is needed * pOut can be null when no string is needed
* *
*/ */
DWORD _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) DWORD _ILGetFileSize(LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize)
{ {
LPPIDLDATA pdata = _ILGetDataPointer(pidl); LPPIDLDATA pdata = _ILGetDataPointer(pidl);
DWORD dwSize; DWORD dwSize;
@ -2517,19 +2443,19 @@ DWORD _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
case PT_VALUE: case PT_VALUE:
dwSize = pdata->u.file.dwFileSize; dwSize = pdata->u.file.dwFileSize;
if (pOut) if (pOut)
StrFormatKBSizeA(dwSize, pOut, uOutSize); StrFormatKBSizeW(dwSize, pOut, uOutSize);
return dwSize; return dwSize;
} }
if (pOut) if (pOut)
*pOut = 0x00; *pOut = UNICODE_NULL;
return 0; return 0;
} }
BOOL _ILGetExtension (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) BOOL _ILGetExtension(LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize)
{ {
char szTemp[MAX_PATH]; WCHAR szTemp[MAX_PATH];
const char * pPoint; LPCWSTR pPoint;
LPCITEMIDLIST pidlTemp=pidl; LPCITEMIDLIST pidlTemp = pidl;
TRACE("pidl=%p\n",pidl); TRACE("pidl=%p\n",pidl);
@ -2540,17 +2466,17 @@ BOOL _ILGetExtension (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
if (!_ILIsValue(pidlTemp)) if (!_ILIsValue(pidlTemp))
return FALSE; return FALSE;
if (!_ILSimpleGetText(pidlTemp, szTemp, MAX_PATH)) if (!_ILSimpleGetTextW(pidlTemp, szTemp, _countof(szTemp)))
return FALSE; return FALSE;
pPoint = PathFindExtensionA(szTemp); pPoint = PathFindExtensionW(szTemp);
if (!*pPoint) if (!*pPoint)
return FALSE; return FALSE;
pPoint++; pPoint++;
lstrcpynA(pOut, pPoint, uOutSize); lstrcpynW(pOut, pPoint, uOutSize);
TRACE("%s\n",pOut); TRACE("%s\n", debugstr_w(pOut));
return TRUE; return TRUE;
} }
@ -2571,60 +2497,41 @@ BOOL _ILGetExtension (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
* NOTES * NOTES
* This function copies as much as possible into the buffer. * This function copies as much as possible into the buffer.
*/ */
void _ILGetFileType(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) void _ILGetFileType(LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize)
{ {
#ifdef __REACTOS__ /* r32966 */ WCHAR sType[64], sTemp[64];
char sType[64];
#endif
if(_ILIsValue(pidl)) if(_ILIsValue(pidl))
{ {
char sTemp[64];
if(uOutSize > 0) if(uOutSize > 0)
pOut[0] = 0; pOut[0] = 0;
#ifdef __REACTOS__ /* r32966 */ if (_ILGetExtension(pidl, sType, _countof(sType)))
if (_ILGetExtension (pidl, sType, 64))
{ {
if (HCR_MapTypeToValueA(sType, sTemp, 64, TRUE)) if (HCR_MapTypeToValueW(sType, sTemp, _countof(sTemp), TRUE))
{ {
/* retrieve description */ /* retrieve description */
if(HCR_MapTypeToValueA(sTemp, pOut, uOutSize, FALSE )) if (HCR_MapTypeToValueW(sTemp, pOut, uOutSize, FALSE))
return; return;
} }
/* display Ext-file as description */ /* display Ext-file as description */
_strupr(sType); CharUpperW(sType);
/* load localized file string */ /* load localized file string */
sTemp[0] = '\0'; sTemp[0] = UNICODE_NULL;
if(LoadStringA(shell32_hInstance, IDS_ANY_FILE, sTemp, 64)) if (LoadStringW(shell32_hInstance, IDS_ANY_FILE, sTemp, _countof(sTemp)))
{ {
sTemp[63] = '\0'; sTemp[_countof(sTemp) - 1] = UNICODE_NULL;
StringCchPrintfA(pOut, uOutSize, sTemp, sType); StringCchPrintfW(pOut, uOutSize, sTemp, sType);
} }
} }
#else
if (_ILGetExtension (pidl, sTemp, 64))
{
if (!( HCR_MapTypeToValueA(sTemp, sTemp, 64, TRUE)
&& HCR_MapTypeToValueA(sTemp, pOut, uOutSize, FALSE )))
{
lstrcpynA (pOut, sTemp, uOutSize - 6);
strcat (pOut, "-file");
}
}
#endif
} }
else else
#ifdef __REACTOS__ /* r32966 */
{ {
pOut[0] = '\0'; pOut[0] = UNICODE_NULL;
LoadStringA(shell32_hInstance, IDS_DIRECTORY, pOut, uOutSize); LoadStringW(shell32_hInstance, IDS_DIRECTORY, pOut, uOutSize);
/* make sure its null terminated */ /* make sure its null terminated */
pOut[uOutSize-1] = '\0'; pOut[uOutSize - 1] = UNICODE_NULL;
} }
#else
lstrcpynA(pOut, "Folder", uOutSize);
#endif
} }
/************************************************************************* /*************************************************************************
@ -2644,7 +2551,7 @@ void _ILGetFileType(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
* return value 0 in case of error is a valid return value * return value 0 in case of error is a valid return value
* *
*/ */
DWORD _ILGetFileAttributes(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) DWORD _ILGetFileAttributes(LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize)
{ {
LPPIDLDATA pData = _ILGetDataPointer(pidl); LPPIDLDATA pData = _ILGetDataPointer(pidl);
WORD wAttrib = 0; WORD wAttrib = 0;
@ -2665,16 +2572,16 @@ DWORD _ILGetFileAttributes(LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize)
{ {
i=0; i=0;
if(wAttrib & FILE_ATTRIBUTE_READONLY) if(wAttrib & FILE_ATTRIBUTE_READONLY)
pOut[i++] = 'R'; pOut[i++] = L'R';
if(wAttrib & FILE_ATTRIBUTE_HIDDEN) if(wAttrib & FILE_ATTRIBUTE_HIDDEN)
pOut[i++] = 'H'; pOut[i++] = L'H';
if(wAttrib & FILE_ATTRIBUTE_SYSTEM) if(wAttrib & FILE_ATTRIBUTE_SYSTEM)
pOut[i++] = 'S'; pOut[i++] = L'S';
if(wAttrib & FILE_ATTRIBUTE_ARCHIVE) if(wAttrib & FILE_ATTRIBUTE_ARCHIVE)
pOut[i++] = 'A'; pOut[i++] = L'A';
if(wAttrib & FILE_ATTRIBUTE_COMPRESSED) if(wAttrib & FILE_ATTRIBUTE_COMPRESSED)
pOut[i++] = 'C'; pOut[i++] = L'C';
pOut[i] = 0x00; pOut[i] = UNICODE_NULL;
} }
return wAttrib; return wAttrib;
} }

View file

@ -218,16 +218,14 @@ typedef struct tagPIDLDATA
/* /*
* getting special values from simple pidls * getting special values from simple pidls
*/ */
DWORD _ILSimpleGetText (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) DECLSPEC_HIDDEN; DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize) DECLSPEC_HIDDEN;
DWORD _ILSimpleGetTextW (LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize) DECLSPEC_HIDDEN; BOOL _ILGetFileDate (LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize) DECLSPEC_HIDDEN;
BOOL _ILGetFileDate (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) DECLSPEC_HIDDEN; DWORD _ILGetFileSize (LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize) DECLSPEC_HIDDEN;
DWORD _ILGetFileSize (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) DECLSPEC_HIDDEN; BOOL _ILGetExtension (LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize) DECLSPEC_HIDDEN;
BOOL _ILGetExtension (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) DECLSPEC_HIDDEN; void _ILGetFileType (LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize) DECLSPEC_HIDDEN;
void _ILGetFileType (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) DECLSPEC_HIDDEN; DWORD _ILGetFileAttributes(LPCITEMIDLIST pidl, LPWSTR pOut, UINT uOutSize) DECLSPEC_HIDDEN;
DWORD _ILGetFileAttributes (LPCITEMIDLIST pidl, LPSTR pOut, UINT uOutSize) DECLSPEC_HIDDEN; BOOL _ILGetFileDateTime (LPCITEMIDLIST pidl, FILETIME *ft) DECLSPEC_HIDDEN;
DWORD _ILGetDrive (LPCITEMIDLIST, LPWSTR, UINT) DECLSPEC_HIDDEN;
BOOL _ILGetFileDateTime (LPCITEMIDLIST pidl, FILETIME *ft) DECLSPEC_HIDDEN;
DWORD _ILGetDrive (LPCITEMIDLIST, LPSTR, UINT) DECLSPEC_HIDDEN;
/* /*
* testing simple pidls * testing simple pidls

View file

@ -382,19 +382,19 @@ static DWORD shgfi_get_exe_type(LPCWSTR szFullPath)
*/ */
BOOL SHELL_IsShortcut(LPCITEMIDLIST pidlLast) BOOL SHELL_IsShortcut(LPCITEMIDLIST pidlLast)
{ {
char szTemp[MAX_PATH]; WCHAR szTemp[MAX_PATH];
HKEY keyCls; HKEY keyCls;
BOOL ret = FALSE; BOOL ret = FALSE;
if (_ILGetExtension(pidlLast, szTemp, MAX_PATH) && if (_ILGetExtension(pidlLast, szTemp, _countof(szTemp)) &&
HCR_MapTypeToValueA(szTemp, szTemp, MAX_PATH, TRUE)) HCR_MapTypeToValueW(szTemp, szTemp, _countof(szTemp), TRUE))
{ {
if (ERROR_SUCCESS == RegOpenKeyExA(HKEY_CLASSES_ROOT, szTemp, 0, KEY_QUERY_VALUE, &keyCls)) if (ERROR_SUCCESS == RegOpenKeyExW(HKEY_CLASSES_ROOT, szTemp, 0, KEY_QUERY_VALUE, &keyCls))
{ {
if (ERROR_SUCCESS == RegQueryValueExA(keyCls, "IsShortcut", NULL, NULL, NULL, NULL)) if (ERROR_SUCCESS == RegQueryValueExW(keyCls, L"IsShortcut", NULL, NULL, NULL, NULL))
ret = TRUE; ret = TRUE;
RegCloseKey(keyCls); RegCloseKey(keyCls);
} }
} }
@ -560,10 +560,7 @@ DWORD_PTR WINAPI SHGetFileInfoW(LPCWSTR path,DWORD dwFileAttributes,
{ {
if (!(flags & SHGFI_USEFILEATTRIBUTES) || (flags & SHGFI_PIDL)) if (!(flags & SHGFI_USEFILEATTRIBUTES) || (flags & SHGFI_PIDL))
{ {
char ftype[80]; _ILGetFileType(pidlLast, psfi->szTypeName, _countof(psfi->szTypeName));
_ILGetFileType(pidlLast, ftype, 80);
MultiByteToWideChar(CP_ACP, 0, ftype, -1, psfi->szTypeName, 80 );
} }
else else
{ {