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