diff --git a/dll/win32/browseui/addresseditbox.cpp b/dll/win32/browseui/addresseditbox.cpp index 60d429f3940..980cc081aef 100644 --- a/dll/win32/browseui/addresseditbox.cpp +++ b/dll/win32/browseui/addresseditbox.cpp @@ -184,7 +184,7 @@ HRESULT STDMETHODCALLTYPE CAddressEditBox::ParseNow(long paramC) CComPtr psfCurrent; HRESULT hr; - ATLASSERT(!m_pidlLastParsed); + m_pidlLastParsed.Free(); CComPtr pbs; hr = IUnknown_QueryService(fSite, SID_SShellBrowser, IID_PPV_ARG(IBrowserService, &pbs)); @@ -220,15 +220,33 @@ HRESULT STDMETHODCALLTYPE CAddressEditBox::ParseNow(long paramC) if (FAILED_UNEXPECTEDLY(hr)) goto parseabsolute; - hr = psfDesktop->BindToObject(pidlCurrent, NULL, IID_PPV_ARG(IShellFolder, &psfCurrent)); - if (FAILED_UNEXPECTEDLY(hr)) - goto parseabsolute; + if (!pidlCurrent->mkid.cb) + { + psfCurrent = psfDesktop; + } + else + { + hr = psfDesktop->BindToObject(pidlCurrent, NULL, IID_PPV_ARG(IShellFolder, &psfCurrent)); + if (FAILED_UNEXPECTEDLY(hr)) + goto parseabsolute; - hr = psfCurrent->ParseDisplayName(topLevelWindow, NULL, address, &eaten, &pidlRelative, &attributes); + WCHAR szPath[MAX_PATH], szFullPath[MAX_PATH]; + if (PathIsRelativeW(address) && SHGetPathFromIDListW(pidlCurrent, szPath)) + { + PathAppendW(szPath, address); + if (GetFullPathNameW(szPath, _countof(szFullPath), szFullPath, NULL)) + { + address.Free(); + SHStrDupW(szFullPath, &address); + } + } + } + + hr = psfCurrent->ParseDisplayName(topLevelWindow, NULL, address, &eaten, &pidlRelative, &attributes); if (SUCCEEDED(hr)) { m_pidlLastParsed.Attach(ILCombine(pidlCurrent, pidlRelative)); - return hr; + return S_OK; } parseabsolute: @@ -271,6 +289,7 @@ HRESULT STDMETHODCALLTYPE CAddressEditBox::Execute(long paramC) if (!m_pidlLastParsed) return E_FAIL; + bParsedForExec = TRUE; } @@ -304,7 +323,7 @@ HRESULT STDMETHODCALLTYPE CAddressEditBox::Execute(long paramC) /* * Attempt to browse to the parsed pidl */ - hr = pisb->BrowseObject(m_pidlLastParsed, 0); + hr = pisb->BrowseObject(m_pidlLastParsed, SBSP_SAMEBROWSER | SBSP_ABSOLUTE); if (SUCCEEDED(hr)) return hr;