[SHELLFIND] Simplify PIDLs to paths

This commit is contained in:
Brock Mammen 2019-08-27 07:46:07 -05:00 committed by Giannis Adamopoulos
parent 0f995d77d1
commit a3ee648d8b

View file

@ -114,7 +114,7 @@ static LPITEMIDLIST _ILCreate(LPCWSTR lpszPath)
} }
LPITEMIDLIST lpLastFSPidl = ILFindLastID(lpFSPidl); LPITEMIDLIST lpLastFSPidl = ILFindLastID(lpFSPidl);
int pathLen = (wcslen(lpszPath) + 1) * sizeof(WCHAR); int pathLen = (PathFindFileNameW(lpszPath) - lpszPath) * sizeof(WCHAR);
int cbData = sizeof(WORD) + pathLen + lpLastFSPidl->mkid.cb; int cbData = sizeof(WORD) + pathLen + lpLastFSPidl->mkid.cb;
LPITEMIDLIST pidl = (LPITEMIDLIST) SHAlloc(cbData + sizeof(WORD)); LPITEMIDLIST pidl = (LPITEMIDLIST) SHAlloc(cbData + sizeof(WORD));
if (!pidl) if (!pidl)
@ -125,7 +125,9 @@ static LPITEMIDLIST _ILCreate(LPCWSTR lpszPath)
p += sizeof(WORD); p += sizeof(WORD);
memcpy(p, lpszPath, pathLen); memcpy(p, lpszPath, pathLen);
p += pathLen; p += pathLen - sizeof(WCHAR);
*((WCHAR *) p) = '\0';
p += sizeof(WCHAR);
memcpy(p, lpLastFSPidl, lpLastFSPidl->mkid.cb); memcpy(p, lpLastFSPidl, lpLastFSPidl->mkid.cb);
p += lpLastFSPidl->mkid.cb; p += lpLastFSPidl->mkid.cb;
@ -436,10 +438,7 @@ STDMETHODIMP CFindFolder::GetDetailsOf(PCUITEMID_CHILD pidl, UINT iColumn, SHELL
if (iColumn == 1) if (iColumn == 1)
{ {
WCHAR path[MAX_PATH]; return SHSetStrRet(&pDetails->str, _ILGetPath(pidl));
wcscpy(path, _ILGetPath(pidl));
PathRemoveFileSpecW(path);
return SHSetStrRet(&pDetails->str, path);
} }
return GetDisplayNameOf(pidl, SHGDN_NORMAL, &pDetails->str); return GetDisplayNameOf(pidl, SHGDN_NORMAL, &pDetails->str);
@ -548,15 +547,10 @@ class CFindFolderContextMenu :
for (UINT i = 0; i < cidl; i++) for (UINT i = 0; i < cidl; i++)
{ {
WCHAR path[MAX_PATH]; CComHeapPtr<ITEMIDLIST> folderPidl(ILCreateFromPathW(_ILGetPath(apidl[i])));
wcscpy(path, (LPCWSTR) apidl[0]->mkid.abID);
PathRemoveFileSpecW(path);
CComHeapPtr<ITEMIDLIST> folderPidl(ILCreateFromPathW(path));
if (!folderPidl) if (!folderPidl)
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
CComHeapPtr<ITEMIDLIST> pidl(ILCreateFromPathW((LPCWSTR) apidl[i]->mkid.abID)); LPCITEMIDLIST pidl = _ILGetFSPidl(apidl[i]);
if (!pidl)
return E_OUTOFMEMORY;
SHOpenFolderAndSelectItems(folderPidl, 1, &pidl, 0); SHOpenFolderAndSelectItems(folderPidl, 1, &pidl, 0);
} }
return S_OK; return S_OK;
@ -607,10 +601,7 @@ STDMETHODIMP CFindFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHI
if (riid == IID_IContextMenu) if (riid == IID_IContextMenu)
{ {
WCHAR path[MAX_PATH]; CComHeapPtr<ITEMIDLIST> folderPidl(ILCreateFromPathW(_ILGetPath(apidl[0])));
wcscpy(path, (LPCWSTR) apidl[0]->mkid.abID);
PathRemoveFileSpecW(path);
CComHeapPtr<ITEMIDLIST> folderPidl(ILCreateFromPathW(path));
if (!folderPidl) if (!folderPidl)
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
CComPtr<IShellFolder> pDesktopFolder; CComPtr<IShellFolder> pDesktopFolder;