[0.4.10][SHELL32] COpenWithMenu: Use ShellExecuteExW to open the file

This picks:
0.4.11-dev-728-g 9baf05f164
which fixes regression CORE-15353 'NOTEPAD does not open text file via openWith-dialog if the filepath contains spaces'
which was unhidden by 0.4.10-dev-599-g 932df378bf
and affected only releases/0.4.10. No older release branches.
I ported it back further anyway, because I do perceive the newer code as superior.

binary size of shell32.dll shrinks slightly:

releases/0.4.10 RosBEWin2.1.6 GCC4.7.2 dbg x86  9.072.128 -> 9.069.568
releases/0.4. 9 RosBEWin2.1.6 GCC4.7.2 dbg x86  8.824.832 -> 8.821.760
releases/0.4. 8 RosBEWin2.1.6 GCC4.7.2 dbg x86  8.738.816 -> 8.736.256
releases/0.4. 7 RosBEWin2.1.6 GCC4.7.2 dbg x86  8.666.624 -> 8.663.040
This commit is contained in:
Joachim Henze 2024-03-04 14:12:56 +01:00
parent 93ccb203ef
commit 282bcc7f22

View file

@ -221,50 +221,30 @@ HICON COpenWithList::GetIcon(SApp *pApp)
BOOL COpenWithList::Execute(COpenWithList::SApp *pApp, LPCWSTR pwszFilePath)
{
STARTUPINFOW si;
PROCESS_INFORMATION pi;
WCHAR wszBuf[MAX_PATH * 2 + 8], *pszEnd = wszBuf;
size_t cchRemaining = _countof(wszBuf);
/* setup path with argument */
ZeroMemory(&si, sizeof(STARTUPINFOW));
si.cb = sizeof(STARTUPINFOW);
/* Build the command line */
for (UINT i = 0; pApp->wszCmd[i] && cchRemaining > 1; ++i)
{
if (pApp->wszCmd[i] != '%')
{
*(pszEnd++) = pApp->wszCmd[i];
--cchRemaining;
}
else if (pApp->wszCmd[++i] == '1')
{
if (StrChrW(pwszFilePath, L' ') && cchRemaining > 3)
StringCchPrintfExW(pszEnd, cchRemaining, &pszEnd, &cchRemaining, 0, L"\"%ls\"", pwszFilePath);
else
StringCchCopyExW(pszEnd, cchRemaining, pwszFilePath, &pszEnd, &cchRemaining, 0);
}
}
/* NULL-terminate the command string */
if (cchRemaining > 0)
*pszEnd = L'\0';
/* Start the application now */
TRACE("Starting process %ls\n", wszBuf);
if (!CreateProcessW(NULL, wszBuf, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
ERR("CreateProcessW %ls failed\n", wszBuf);
return FALSE;
}
WCHAR wszBuf[256];
HKEY hKey;
/* Add app to registry if it wasnt there before */
SaveApp(pApp);
if (!pApp->bMRUList)
AddAppToMRUList(pApp, pwszFilePath);
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
/* Get a handle to the reg key */
StringCbPrintfW(wszBuf, sizeof(wszBuf), L"Applications\\%s", pApp->wszFilename);
if (RegCreateKeyEx(HKEY_CLASSES_ROOT, wszBuf, 0, NULL, 0, KEY_WRITE, NULL, &hKey, NULL) != ERROR_SUCCESS)
{
ERR("RegOpenKeyEx failed\n");
return FALSE;
}
/* Let ShellExecuteExW do the work */
SHELLEXECUTEINFOW sei = {sizeof(SHELLEXECUTEINFOW), SEE_MASK_CLASSKEY};
sei.nShow = SW_SHOWNORMAL;
sei.hkeyClass = hKey;
sei.lpFile = pwszFilePath;
ShellExecuteExW(&sei);
return TRUE;
}