https://git.reactos.org/?p=reactos.git;a=commitdiff;h=9baf05f164bd12b4351a10...
commit 9baf05f164bd12b4351a101a17cf7db9f5debb7b Author: Giannis Adamopoulos gadamopoulos@reactos.org AuthorDate: Thu Nov 15 21:24:56 2018 +0200 Commit: Giannis Adamopoulos gadamopoulos@reactos.org CommitDate: Thu Nov 15 21:26:17 2018 +0200
[SHELL32] COpenWithMenu: Use ShellExecuteExW to open the file CORE-15353 --- dll/win32/shell32/COpenWithMenu.cpp | 54 ++++++++++++------------------------- 1 file changed, 17 insertions(+), 37 deletions(-)
diff --git a/dll/win32/shell32/COpenWithMenu.cpp b/dll/win32/shell32/COpenWithMenu.cpp index 485623fe3a..c2a2f19efe 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); + WCHAR wszBuf[256]; + HKEY hKey;
- /* 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'; + /* Add app to registry if it wasnt there before */ + SaveApp(pApp); + if (!pApp->bMRUList) + AddAppToMRUList(pApp, pwszFilePath);
- /* Start the application now */ - TRACE("Starting process %ls\n", wszBuf); - if (!CreateProcessW(NULL, wszBuf, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) + /* 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("CreateProcessW %ls failed\n", wszBuf); + ERR("RegOpenKeyEx failed\n"); return FALSE; }
- /* Add app to registry if it wasnt there before */ - SaveApp(pApp); - if (!pApp->bMRUList) - AddAppToMRUList(pApp, pwszFilePath); + /* Let ShellExecuteExW do the work */ + SHELLEXECUTEINFOW sei = {sizeof(SHELLEXECUTEINFOW), SEE_MASK_CLASSKEY}; + sei.nShow = SW_SHOWNORMAL; + sei.hkeyClass = hKey; + sei.lpFile = pwszFilePath; + + ShellExecuteExW(&sei);
- CloseHandle(pi.hThread); - CloseHandle(pi.hProcess); return TRUE; }