mirror of
https://github.com/reactos/reactos.git
synced 2025-07-04 20:11:22 +00:00
hopefully the last fix for _SHGetPathFromIDListA/W() to be compatible with MS Windows and make control panel icons reappear
svn path=/trunk/; revision=7495
This commit is contained in:
parent
4f28875a40
commit
c7b79d1742
2 changed files with 33 additions and 44 deletions
|
@ -1297,16 +1297,17 @@ HRESULT _SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSize)
|
|||
LPSTR pstr;
|
||||
LPSTR end = pszPath + uOutSize;
|
||||
|
||||
if (_ILIsMyComputer(pidl)) { /* optimized loop to retrieve file system paths */
|
||||
/* If the item ID list begins at "My Computer", we can use
|
||||
an optimized loop to retrieve file system paths. */
|
||||
if (_ILIsMyComputer(pidl)) {
|
||||
LPCITEMIDLIST p = ILGetNext(pidl);
|
||||
LPSTR txt;
|
||||
|
||||
pstr = pszPath;
|
||||
end = pszPath + MAX_PATH;
|
||||
|
||||
while(p && p->mkid.cb && pstr<end) {
|
||||
if (_ILIsSpecialFolder(p))
|
||||
break;
|
||||
return E_INVALIDARG;
|
||||
|
||||
txt = _ILGetTextPointer(p);
|
||||
if (!txt)
|
||||
|
@ -1329,33 +1330,26 @@ HRESULT _SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSize)
|
|||
|
||||
pstr = pszPath;
|
||||
|
||||
/* The only other valid case is a simple PIDL rooted at desktop level */
|
||||
if (_ILIsValue(pidl) && _ILIsPidlSimple(pidl)) {
|
||||
hr = SHGetDesktopFolder(&desktop);
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
if (_ILIsValue(pidl)) {
|
||||
hr = SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOP, FALSE);
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
pstr = PathAddBackslashA(pszPath);
|
||||
hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
|
||||
}
|
||||
}
|
||||
else
|
||||
hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
|
||||
|
||||
IShellFolder_Release(desktop);
|
||||
}
|
||||
} else
|
||||
return E_INVALIDARG;
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
if (SUCCEEDED(hr))
|
||||
hr = StrRetToStrNA(pstr, end-pstr, &str, pidl);
|
||||
|
||||
/* don't allow to return displaynames of the form "::{guid}" */
|
||||
if (pstr[0]==':' && pstr[1]==':') {
|
||||
*pszPath = '\0';
|
||||
hr = E_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
TRACE_(shell)("-- %s, 0x%08lx\n",pszPath, hr);
|
||||
return hr;
|
||||
}
|
||||
|
@ -1401,7 +1395,9 @@ HRESULT _SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize)
|
|||
LPWSTR pstr;
|
||||
LPWSTR end = pszPath + uOutSize;
|
||||
|
||||
if (_ILIsMyComputer(pidl)) { /* optimized loop to retrieve file system paths */
|
||||
/* If the item ID list begins at "My Computer", we can use
|
||||
an optimized loop to retrieve file system paths. */
|
||||
if (_ILIsMyComputer(pidl)) {
|
||||
LPCITEMIDLIST p = ILGetNext(pidl);
|
||||
LPSTR txt;
|
||||
|
||||
|
@ -1409,7 +1405,7 @@ HRESULT _SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize)
|
|||
|
||||
while(p && p->mkid.cb && pstr<end) {
|
||||
if (_ILIsSpecialFolder(p))
|
||||
break;
|
||||
return E_INVALIDARG;
|
||||
|
||||
txt = _ILGetTextPointer(p);
|
||||
if (!txt)
|
||||
|
@ -1433,33 +1429,26 @@ HRESULT _SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize)
|
|||
|
||||
pstr = pszPath;
|
||||
|
||||
/* The only other valid case is a simple PIDL rooted at desktop level */
|
||||
if (_ILIsValue(pidl) && _ILIsPidlSimple(pidl)) {
|
||||
hr = SHGetDesktopFolder(&desktop);
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
if (_ILIsValue(pidl)) {
|
||||
hr = SHGetSpecialFolderPathW(0, pszPath, CSIDL_DESKTOP, FALSE);
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
pstr = PathAddBackslashW(pszPath);
|
||||
hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
|
||||
}
|
||||
}
|
||||
else
|
||||
hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
|
||||
|
||||
IShellFolder_Release(desktop);
|
||||
}
|
||||
} else
|
||||
return E_INVALIDARG;
|
||||
|
||||
if (SUCCEEDED(hr)) {
|
||||
if (SUCCEEDED(hr))
|
||||
hr = StrRetToStrNW(pstr, end-pstr, &str, pidl);
|
||||
|
||||
/* don't allow to return displaynames of the form "::{guid}" */
|
||||
if (pstr[0]==':' && pstr[1]==':') {
|
||||
*pszPath = '\0';
|
||||
hr = E_FAIL;
|
||||
}
|
||||
}
|
||||
|
||||
TRACE_(shell)("-- %s, 0x%08lx\n",debugstr_w(pszPath), hr);
|
||||
return hr;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue