https://git.reactos.org/?p=reactos.git;a=commitdiff;h=9baf05f164bd12b4351a101a17cf7db9f5debb7b

commit 9baf05f164bd12b4351a101a17cf7db9f5debb7b
Author:     Giannis Adamopoulos <[email protected]>
AuthorDate: Thu Nov 15 21:24:56 2018 +0200
Commit:     Giannis Adamopoulos <[email protected]>
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;
 }
 

Reply via email to