[SHELL32] Improve Start-Run Dialog Box Features (#3797) CORE-17351 CORE-16898

Improve performance of Start-Run Dialog Box Options

This will fix:
CORE-17351 'RunDlg fails calling URL without http'
and
CORE-16898 'RunCommand "iexplore" fails to open Wine IE'
Both regressed by 0.4.10-dev-419-g bfcbda227f
This commit is contained in:
Doug Lyons 2021-07-06 12:36:15 -05:00 committed by GitHub
parent 76ce08dcec
commit 33c7c91b36
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -586,6 +586,7 @@ static INT_PTR CALLBACK RunDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARA
INT ic; INT ic;
WCHAR *psz, *pszExpanded, *parent = NULL; WCHAR *psz, *pszExpanded, *parent = NULL;
DWORD cchExpand; DWORD cchExpand;
SHELLEXECUTEINFOW sei;
NMRUNFILEDLGW nmrfd; NMRUNFILEDLGW nmrfd;
ic = GetWindowTextLengthW(htxt); ic = GetWindowTextLengthW(htxt);
@ -595,6 +596,9 @@ static INT_PTR CALLBACK RunDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARA
return TRUE; return TRUE;
} }
ZeroMemory(&sei, sizeof(sei));
sei.cbSize = sizeof(sei);
/* /*
* Allocate a new MRU entry, we need to add two characters * Allocate a new MRU entry, we need to add two characters
* for the terminating "\\1" part, then the NULL character. * for the terminating "\\1" part, then the NULL character.
@ -607,6 +611,9 @@ static INT_PTR CALLBACK RunDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARA
} }
GetWindowTextW(htxt, psz, ic + 1); GetWindowTextW(htxt, psz, ic + 1);
sei.hwnd = hwnd;
sei.nShow = SW_SHOWNORMAL;
sei.lpFile = psz;
StrTrimW(psz, L" \t"); StrTrimW(psz, L" \t");
if (wcschr(psz, L'%') != NULL) if (wcschr(psz, L'%') != NULL)
@ -635,11 +642,20 @@ static INT_PTR CALLBACK RunDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARA
*/ */
LPCWSTR pszStartDir; LPCWSTR pszStartDir;
if (prfdp->lpstrDirectory) if (prfdp->lpstrDirectory)
{
sei.lpDirectory = prfdp->lpstrDirectory;
pszStartDir = prfdp->lpstrDirectory; pszStartDir = prfdp->lpstrDirectory;
}
else if (prfdp->uFlags & RFF_CALCDIRECTORY) else if (prfdp->uFlags & RFF_CALCDIRECTORY)
{
sei.lpDirectory = parent = RunDlg_GetParentDir(sei.lpFile);
pszStartDir = parent = RunDlg_GetParentDir(pszExpanded); pszStartDir = parent = RunDlg_GetParentDir(pszExpanded);
}
else else
{
sei.lpDirectory = NULL;
pszStartDir = NULL; pszStartDir = NULL;
}
/* Hide the dialog for now on, we will show it up in case of retry */ /* Hide the dialog for now on, we will show it up in case of retry */
ShowWindow(hwnd, SW_HIDE); ShowWindow(hwnd, SW_HIDE);
@ -669,10 +685,21 @@ static INT_PTR CALLBACK RunDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARA
break; break;
case RF_OK: case RF_OK:
/* We use SECL_NO_UI because we don't want to see
* errors here, but we will try again below and
* there we will output our errors. */
if (SUCCEEDED(ShellExecCmdLine(hwnd, pszExpanded, pszStartDir, SW_SHOWNORMAL, NULL, if (SUCCEEDED(ShellExecCmdLine(hwnd, pszExpanded, pszStartDir, SW_SHOWNORMAL, NULL,
SECL_ALLOW_NONEXE))) SECL_ALLOW_NONEXE | SECL_NO_UI)))
{ {
/* Call again GetWindowText in case the contents of the edit box has changed? */ /* Call GetWindowText again in case the contents of the edit box have changed. */
GetWindowTextW(htxt, psz, ic + 1);
FillList(htxt, psz, ic + 2 + 1, FALSE);
EndDialog(hwnd, IDOK);
break;
}
else if (SUCCEEDED(ShellExecuteExW(&sei)))
{
/* Call GetWindowText again in case the contents of the edit box have changed. */
GetWindowTextW(htxt, psz, ic + 1); GetWindowTextW(htxt, psz, ic + 1);
FillList(htxt, psz, ic + 2 + 1, FALSE); FillList(htxt, psz, ic + 2 + 1, FALSE);
EndDialog(hwnd, IDOK); EndDialog(hwnd, IDOK);