https://git.reactos.org/?p=reactos.git;a=commitdiff;h=9baf05f164bd12b4351a1…
commit 9baf05f164bd12b4351a101a17cf7db9f5debb7b
Author: Giannis Adamopoulos <gadamopoulos(a)reactos.org>
AuthorDate: Thu Nov 15 21:24:56 2018 +0200
Commit: Giannis Adamopoulos <gadamopoulos(a)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;
}