From 9baf05f164bd12b4351a101a17cf7db9f5debb7b Mon Sep 17 00:00:00 2001 From: Giannis Adamopoulos Date: Thu, 15 Nov 2018 21:24:56 +0200 Subject: [PATCH] [SHELL32] COpenWithMenu: Use ShellExecuteExW to open the file CORE-15353 --- dll/win32/shell32/COpenWithMenu.cpp | 56 ++++++++++------------------- 1 file changed, 18 insertions(+), 38 deletions(-) diff --git a/dll/win32/shell32/COpenWithMenu.cpp b/dll/win32/shell32/COpenWithMenu.cpp index 485623fe3a0..c2a2f19efe7 100644 --- a/dll/win32/shell32/COpenWithMenu.cpp +++ b/dll/win32/shell32/COpenWithMenu.cpp @@ -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; }