Skip to content

Commit a17b6e9

Browse files
authored
[SHELL32][BROWSEUI] Set DefView InvokeCommand directory (reactos#7495)
If a .lnk shortcut does not specify a working directory, it should use the directory provided by the InvokeCommand caller when it's launced. CORE-19855
1 parent 3ecd236 commit a17b6e9

File tree

4 files changed

+37
-1
lines changed

4 files changed

+37
-1
lines changed

dll/win32/browseui/shellfind/CFindFolder.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -937,6 +937,22 @@ STDMETHODIMP CFindFolder::MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam)
937937
CComVariant searchBar(pwszGuid);
938938
return pWebBrowser2->ShowBrowserBar(&searchBar, NULL, NULL);
939939
}
940+
case SFVM_GETCOMMANDDIR:
941+
{
942+
HRESULT hr = E_FAIL;
943+
if (m_shellFolderView)
944+
{
945+
PCUITEMID_CHILD *apidl;
946+
UINT cidl = 0;
947+
if (SUCCEEDED(hr = m_shellFolderView->GetSelectedObjects(&apidl, &cidl)))
948+
{
949+
if (cidl)
950+
hr = StringCchCopyW((PWSTR)lParam, wParam, _ILGetPath(apidl[0]));
951+
LocalFree(apidl);
952+
}
953+
}
954+
return hr;
955+
}
940956
}
941957
return E_NOTIMPL;
942958
}

dll/win32/shell32/CShellLink.cpp

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2623,6 +2623,7 @@ HRESULT STDMETHODCALLTYPE CShellLink::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
26232623

26242624
HRESULT CShellLink::DoOpen(LPCMINVOKECOMMANDINFO lpici)
26252625
{
2626+
LPCMINVOKECOMMANDINFOEX iciex = (LPCMINVOKECOMMANDINFOEX)lpici;
26262627
const BOOL unicode = IsUnicode(*lpici);
26272628

26282629
CStringW args;
@@ -2631,7 +2632,6 @@ HRESULT CShellLink::DoOpen(LPCMINVOKECOMMANDINFO lpici)
26312632

26322633
if (unicode)
26332634
{
2634-
LPCMINVOKECOMMANDINFOEX iciex = (LPCMINVOKECOMMANDINFOEX)lpici;
26352635
if (!StrIsNullOrEmpty(iciex->lpParametersW))
26362636
{
26372637
args += L' ';
@@ -2674,6 +2674,15 @@ HRESULT CShellLink::DoOpen(LPCMINVOKECOMMANDINFO lpici)
26742674
if (lpici->nShow != SW_SHOWNORMAL && lpici->nShow != SW_SHOW)
26752675
sei.nShow = lpici->nShow; // Allow invoker to override .lnk show mode
26762676

2677+
// Use the invoker specified working directory if the link did not specify one
2678+
if (StrIsNullOrEmpty(sei.lpDirectory) || !PathIsDirectoryW(sei.lpDirectory))
2679+
{
2680+
LPCSTR pszDirA = lpici->lpDirectory;
2681+
if (unicode && !StrIsNullOrEmpty(iciex->lpDirectoryW))
2682+
sei.lpDirectory = iciex->lpDirectoryW;
2683+
else if (pszDirA && SHAnsiToUnicode(pszDirA, dir, _countof(dir)))
2684+
sei.lpDirectory = dir;
2685+
}
26772686
return (ShellExecuteExW(&sei) ? S_OK : E_FAIL);
26782687
}
26792688

dll/win32/shell32/folders/CDesktopFolder.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1069,6 +1069,13 @@ HRESULT WINAPI CDesktopFolderViewCB::MessageSFVCB(UINT uMsg, WPARAM wParam, LPAR
10691069
case SFVM_VIEWRELEASE:
10701070
m_pShellView = NULL;
10711071
return S_OK;
1072+
case SFVM_GETCOMMANDDIR:
1073+
{
1074+
WCHAR buf[MAX_PATH];
1075+
if (SHGetSpecialFolderPathW(NULL, buf, CSIDL_DESKTOPDIRECTORY, TRUE))
1076+
return StringCchCopyW((PWSTR)lParam, wParam, buf);
1077+
break;
1078+
}
10721079
}
10731080
return E_NOTIMPL;
10741081
}

dll/win32/shell32/folders/CFSFolder.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2076,6 +2076,10 @@ HRESULT WINAPI CFSFolder::MessageSFVCB(UINT uMsg, WPARAM wParam, LPARAM lParam)
20762076
case SFVM_GET_CUSTOMVIEWINFO:
20772077
hr = GetCustomViewInfo((ULONG)wParam, (SFVM_CUSTOMVIEWINFO_DATA *)lParam);
20782078
break;
2079+
case SFVM_GETCOMMANDDIR:
2080+
if (m_sPathTarget)
2081+
hr = StringCchCopyW((PWSTR)lParam, wParam, m_sPathTarget);
2082+
break;
20792083
}
20802084
return hr;
20812085
}

0 commit comments

Comments
 (0)