Implement SHGetPathFromIDList based on GetDisplayNameOf.
This commit is contained in:
parent
7691aca10c
commit
ebb1aaee86
@ -1209,87 +1209,6 @@ HRESULT WINAPI SHGetDataFromIDListW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl,
|
|||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* SHELL_GetPathFromIDListA
|
|
||||||
*/
|
|
||||||
HRESULT SHELL_GetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSize)
|
|
||||||
{
|
|
||||||
HRESULT hr = S_OK;
|
|
||||||
|
|
||||||
pszPath[0]=0;
|
|
||||||
|
|
||||||
/* One case is a PIDL rooted at desktop level */
|
|
||||||
if (_ILIsDesktop(pidl) || _ILIsValue(pidl) || _ILIsFolder(pidl))
|
|
||||||
{
|
|
||||||
hr = SHGetSpecialFolderPathA(0, pszPath, CSIDL_DESKTOP, FALSE);
|
|
||||||
|
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
PathAddBackslashA(pszPath);
|
|
||||||
}
|
|
||||||
/* The only other valid case is an item ID list beginning at "My Computer" */
|
|
||||||
else if (_ILIsMyComputer(pidl))
|
|
||||||
pidl = ILGetNext(pidl);
|
|
||||||
|
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
{
|
|
||||||
LPSTR txt;
|
|
||||||
|
|
||||||
while(pidl && pidl->mkid.cb)
|
|
||||||
{
|
|
||||||
if (_ILIsSpecialFolder(pidl))
|
|
||||||
{
|
|
||||||
hr = E_INVALIDARG;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
txt = _ILGetTextPointer(pidl);
|
|
||||||
if (!txt)
|
|
||||||
{
|
|
||||||
hr = E_INVALIDARG;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lstrlenA(txt) > pidl->mkid.cb)
|
|
||||||
ERR("pidl %p is borked\n",pidl);
|
|
||||||
|
|
||||||
/* make sure there's enough space for the next segment */
|
|
||||||
if ((lstrlenA(txt) + lstrlenA(pszPath)) > uOutSize)
|
|
||||||
{
|
|
||||||
hr = E_INVALIDARG;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
lstrcatA( pszPath, txt );
|
|
||||||
|
|
||||||
pidl = ILGetNext(pidl);
|
|
||||||
if (!pidl)
|
|
||||||
{
|
|
||||||
hr = E_INVALIDARG;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Are we at the end and successfully converted the complete PIDL? */
|
|
||||||
if (!pidl->mkid.cb)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if ((lstrlenA(pszPath) + 1) > uOutSize)
|
|
||||||
{
|
|
||||||
hr = E_INVALIDARG;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!PathAddBackslashA(pszPath))
|
|
||||||
{
|
|
||||||
hr = E_INVALIDARG;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
hr = E_INVALIDARG;
|
|
||||||
|
|
||||||
TRACE_(shell)("-- %s, 0x%08lx\n", pszPath, hr);
|
|
||||||
return hr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* SHGetPathFromIDListA [SHELL32.@][NT 4.0: SHELL32.220]
|
* SHGetPathFromIDListA [SHELL32.@][NT 4.0: SHELL32.220]
|
||||||
*
|
*
|
||||||
@ -1307,100 +1226,14 @@ HRESULT SHELL_GetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSiz
|
|||||||
*/
|
*/
|
||||||
BOOL WINAPI SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath)
|
BOOL WINAPI SHGetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
WCHAR wszPath[MAX_PATH];
|
||||||
|
BOOL bSuccess;
|
||||||
|
|
||||||
TRACE_(shell)("(pidl=%p,%p)\n",pidl,pszPath);
|
bSuccess = SHGetPathFromIDListW(pidl, wszPath);
|
||||||
pdump(pidl);
|
if (bSuccess)
|
||||||
|
WideCharToMultiByte(CP_ACP, 0, wszPath, -1, pszPath, MAX_PATH, NULL, NULL);
|
||||||
|
|
||||||
if (!pidl)
|
return bSuccess;
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
hr = SHELL_GetPathFromIDListA(pidl, pszPath, MAX_PATH);
|
|
||||||
|
|
||||||
return SUCCEEDED(hr);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*************************************************************************
|
|
||||||
* SHELL_GetPathFromIDListW
|
|
||||||
*/
|
|
||||||
HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize)
|
|
||||||
{
|
|
||||||
HRESULT hr = S_OK;
|
|
||||||
UINT len;
|
|
||||||
|
|
||||||
pszPath[0]=0;
|
|
||||||
|
|
||||||
/* One case is a PIDL rooted at desktop level */
|
|
||||||
if (_ILIsDesktop(pidl) ||_ILIsValue(pidl) || _ILIsFolder(pidl))
|
|
||||||
{
|
|
||||||
hr = SHGetSpecialFolderPathW(0, pszPath, CSIDL_DESKTOP, FALSE);
|
|
||||||
|
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
PathAddBackslashW(pszPath);
|
|
||||||
}
|
|
||||||
/* The only other valid case is an item ID list beginning at "My Computer" */
|
|
||||||
else if (_ILIsMyComputer(pidl))
|
|
||||||
pidl = ILGetNext(pidl);
|
|
||||||
|
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
{
|
|
||||||
LPSTR txt;
|
|
||||||
|
|
||||||
while(pidl && pidl->mkid.cb)
|
|
||||||
{
|
|
||||||
if (_ILIsSpecialFolder(pidl))
|
|
||||||
{
|
|
||||||
hr = E_INVALIDARG;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
txt = _ILGetTextPointer(pidl);
|
|
||||||
if (!txt)
|
|
||||||
{
|
|
||||||
hr = E_INVALIDARG;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (lstrlenA(txt) > pidl->mkid.cb)
|
|
||||||
ERR("pidl %p is borked\n",pidl);
|
|
||||||
len = MultiByteToWideChar(CP_ACP, 0, txt, -1, NULL, 0);
|
|
||||||
if ( (lstrlenW(pszPath) + len) > uOutSize )
|
|
||||||
{
|
|
||||||
hr = E_INVALIDARG;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
MultiByteToWideChar(CP_ACP, 0, txt, -1,
|
|
||||||
&pszPath[lstrlenW(pszPath)], len);
|
|
||||||
|
|
||||||
pidl = ILGetNext(pidl);
|
|
||||||
if (!pidl)
|
|
||||||
{
|
|
||||||
hr = E_INVALIDARG;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Are we at the end and successfully converted the complete PIDL? */
|
|
||||||
if (!pidl->mkid.cb)
|
|
||||||
break;
|
|
||||||
|
|
||||||
if ((lstrlenW(pszPath) + 1) > uOutSize )
|
|
||||||
{
|
|
||||||
hr = E_INVALIDARG;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!PathAddBackslashW(pszPath))
|
|
||||||
{
|
|
||||||
hr = E_INVALIDARG;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
hr = E_INVALIDARG;
|
|
||||||
|
|
||||||
TRACE_(shell)("-- %s, 0x%08lx\n", debugstr_w(pszPath), hr);
|
|
||||||
return hr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
@ -1409,6 +1242,10 @@ HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSi
|
|||||||
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
|
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
LPCITEMIDLIST pidlLast;
|
||||||
|
LPSHELLFOLDER psfFolder;
|
||||||
|
DWORD dwAttributes;
|
||||||
|
STRRET strret;
|
||||||
|
|
||||||
TRACE_(shell)("(pidl=%p,%p)\n", pidl, debugstr_w(pszPath));
|
TRACE_(shell)("(pidl=%p,%p)\n", pidl, debugstr_w(pszPath));
|
||||||
pdump(pidl);
|
pdump(pidl);
|
||||||
@ -1416,7 +1253,18 @@ BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
|
|||||||
if (!pidl)
|
if (!pidl)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
hr = SHELL_GetPathFromIDListW(pidl, pszPath, MAX_PATH);
|
hr = SHBindToParent(pidl, &IID_IShellFolder, (VOID**)&psfFolder, &pidlLast);
|
||||||
|
if (FAILED(hr)) return FALSE;
|
||||||
|
|
||||||
|
dwAttributes = SFGAO_FILESYSTEM;
|
||||||
|
hr = IShellFolder_GetAttributesOf(psfFolder, 1, &pidlLast, &dwAttributes);
|
||||||
|
if (FAILED(hr) || !(dwAttributes & SFGAO_FILESYSTEM)) return FALSE;
|
||||||
|
|
||||||
|
hr = IShellFolder_GetDisplayNameOf(psfFolder, pidlLast, SHGDN_FORPARSING, &strret);
|
||||||
|
if (FAILED(hr)) return FALSE;
|
||||||
|
|
||||||
|
hr = StrRetToBufW(&strret, pidlLast, pszPath, MAX_PATH);
|
||||||
|
IShellFolder_Release(psfFolder);
|
||||||
|
|
||||||
TRACE_(shell)("-- %s, 0x%08lx\n",debugstr_w(pszPath), hr);
|
TRACE_(shell)("-- %s, 0x%08lx\n",debugstr_w(pszPath), hr);
|
||||||
return SUCCEEDED(hr);
|
return SUCCEEDED(hr);
|
||||||
|
@ -257,7 +257,4 @@ LPITEMIDLIST * _ILCopyCidaToaPidl(LPITEMIDLIST* pidl, LPIDA cida);
|
|||||||
BOOL WINAPI ILGetDisplayNameExA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPSTR path, DWORD type);
|
BOOL WINAPI ILGetDisplayNameExA(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPSTR path, DWORD type);
|
||||||
BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type);
|
BOOL WINAPI ILGetDisplayNameExW(LPSHELLFOLDER psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type);
|
||||||
|
|
||||||
HRESULT SHELL_GetPathFromIDListA(LPCITEMIDLIST pidl, LPSTR pszPath, UINT uOutSize);
|
|
||||||
HRESULT SHELL_GetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath, UINT uOutSize);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user