mirror of
https://github.com/reactos/reactos.git
synced 2025-07-06 04:01: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 pstr;
|
||||||
LPSTR end = pszPath + uOutSize;
|
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);
|
LPCITEMIDLIST p = ILGetNext(pidl);
|
||||||
LPSTR txt;
|
LPSTR txt;
|
||||||
|
|
||||||
pstr = pszPath;
|
pstr = pszPath;
|
||||||
end = pszPath + MAX_PATH;
|
|
||||||
|
|
||||||
while(p && p->mkid.cb && pstr<end) {
|
while(p && p->mkid.cb && pstr<end) {
|
||||||
if (_ILIsSpecialFolder(p))
|
if (_ILIsSpecialFolder(p))
|
||||||
break;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
txt = _ILGetTextPointer(p);
|
txt = _ILGetTextPointer(p);
|
||||||
if (!txt)
|
if (!txt)
|
||||||
|
@ -1329,33 +1330,26 @@ HRESULT _SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSize)
|
||||||
|
|
||||||
pstr = pszPath;
|
pstr = pszPath;
|
||||||
|
|
||||||
|
/* The only other valid case is a simple PIDL rooted at desktop level */
|
||||||
|
if (_ILIsValue(pidl) && _ILIsPidlSimple(pidl)) {
|
||||||
hr = SHGetDesktopFolder(&desktop);
|
hr = SHGetDesktopFolder(&desktop);
|
||||||
|
|
||||||
if (SUCCEEDED(hr)) {
|
if (SUCCEEDED(hr)) {
|
||||||
if (_ILIsValue(pidl)) {
|
|
||||||
hr = SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOP, FALSE);
|
hr = SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOP, FALSE);
|
||||||
|
|
||||||
if (SUCCEEDED(hr)) {
|
if (SUCCEEDED(hr)) {
|
||||||
pstr = PathAddBackslashA(pszPath);
|
pstr = PathAddBackslashA(pszPath);
|
||||||
hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
|
hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
|
|
||||||
|
|
||||||
IShellFolder_Release(desktop);
|
IShellFolder_Release(desktop);
|
||||||
}
|
}
|
||||||
|
} else
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
if (SUCCEEDED(hr)) {
|
if (SUCCEEDED(hr))
|
||||||
hr = StrRetToStrNA(pstr, end-pstr, &str, pidl);
|
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);
|
TRACE_(shell)("-- %s, 0x%08lx\n",pszPath, hr);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
@ -1401,7 +1395,9 @@ HRESULT _SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize)
|
||||||
LPWSTR pstr;
|
LPWSTR pstr;
|
||||||
LPWSTR end = pszPath + uOutSize;
|
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);
|
LPCITEMIDLIST p = ILGetNext(pidl);
|
||||||
LPSTR txt;
|
LPSTR txt;
|
||||||
|
|
||||||
|
@ -1409,7 +1405,7 @@ HRESULT _SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize)
|
||||||
|
|
||||||
while(p && p->mkid.cb && pstr<end) {
|
while(p && p->mkid.cb && pstr<end) {
|
||||||
if (_ILIsSpecialFolder(p))
|
if (_ILIsSpecialFolder(p))
|
||||||
break;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
txt = _ILGetTextPointer(p);
|
txt = _ILGetTextPointer(p);
|
||||||
if (!txt)
|
if (!txt)
|
||||||
|
@ -1433,33 +1429,26 @@ HRESULT _SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize)
|
||||||
|
|
||||||
pstr = pszPath;
|
pstr = pszPath;
|
||||||
|
|
||||||
|
/* The only other valid case is a simple PIDL rooted at desktop level */
|
||||||
|
if (_ILIsValue(pidl) && _ILIsPidlSimple(pidl)) {
|
||||||
hr = SHGetDesktopFolder(&desktop);
|
hr = SHGetDesktopFolder(&desktop);
|
||||||
|
|
||||||
if (SUCCEEDED(hr)) {
|
if (SUCCEEDED(hr)) {
|
||||||
if (_ILIsValue(pidl)) {
|
|
||||||
hr = SHGetSpecialFolderPathW(0, pszPath, CSIDL_DESKTOP, FALSE);
|
hr = SHGetSpecialFolderPathW(0, pszPath, CSIDL_DESKTOP, FALSE);
|
||||||
|
|
||||||
if (SUCCEEDED(hr)) {
|
if (SUCCEEDED(hr)) {
|
||||||
pstr = PathAddBackslashW(pszPath);
|
pstr = PathAddBackslashW(pszPath);
|
||||||
hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
|
hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
hr = IShellFolder_GetDisplayNameOf(desktop, pidl, SHGDN_FORPARSING, &str);
|
|
||||||
|
|
||||||
IShellFolder_Release(desktop);
|
IShellFolder_Release(desktop);
|
||||||
}
|
}
|
||||||
|
} else
|
||||||
|
return E_INVALIDARG;
|
||||||
|
|
||||||
if (SUCCEEDED(hr)) {
|
if (SUCCEEDED(hr))
|
||||||
hr = StrRetToStrNW(pstr, end-pstr, &str, pidl);
|
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);
|
TRACE_(shell)("-- %s, 0x%08lx\n",debugstr_w(pszPath), hr);
|
||||||
return hr;
|
return hr;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue