https://git.reactos.org/?p=reactos.git;a=commitdiff;h=964c22c1cae372ad6562207fcbffa67c193dd501

commit 964c22c1cae372ad6562207fcbffa67c193dd501
Author:     Mark Jansen <[email protected]>
AuthorDate: Sun Sep 20 22:18:08 2020 +0200
Commit:     Mark Jansen <[email protected]>
CommitDate: Sun Oct 25 15:44:33 2020 +0100

    [RAPPS][RAPPS.COM] Introduce a rapps console shim
    rapps.com will be launched when running 'rapps' from cmd or
    from run, and since it is a console application, explorer/ cmd will
    wait for it.
    This rapps.com passes the commandline to rapps.exe,
    and wait for rapps.exe to exit before closing.
    
    CORE-17281
---
 base/applications/CMakeLists.txt             |   1 +
 base/applications/rapps/CMakeLists.txt       |   2 +-
 base/applications/rapps/appview.cpp          |  10 +++-
 base/applications/rapps/available.cpp        |   4 +-
 base/applications/rapps/include/unattended.h |   2 +
 base/applications/rapps/unattended.cpp       |  55 ++++++++++----------
 base/applications/rapps/winmain.cpp          |  11 ++--
 base/applications/rapps_com/CMakeLists.txt   |   7 +++
 base/applications/rapps_com/main.c           |  73 +++++++++++++++++++++++++++
 base/applications/rapps_com/main.ico         | Bin 0 -> 29926 bytes
 base/applications/rapps_com/rapps.rc         |   5 ++
 11 files changed, 128 insertions(+), 42 deletions(-)

diff --git a/base/applications/CMakeLists.txt b/base/applications/CMakeLists.txt
index 74ddde5815c..082b2121b35 100644
--- a/base/applications/CMakeLists.txt
+++ b/base/applications/CMakeLists.txt
@@ -30,6 +30,7 @@ add_subdirectory(network)
 add_subdirectory(notepad)
 add_subdirectory(osk)
 add_subdirectory(rapps)
+add_subdirectory(rapps_com)
 add_subdirectory(regedit)
 add_subdirectory(regedt32)
 add_subdirectory(sc)
diff --git a/base/applications/rapps/CMakeLists.txt 
b/base/applications/rapps/CMakeLists.txt
index cb559b5509d..4da7397229f 100644
--- a/base/applications/rapps/CMakeLists.txt
+++ b/base/applications/rapps/CMakeLists.txt
@@ -41,7 +41,7 @@ add_definitions(
 file(GLOB_RECURSE rapps_rc_deps res/*.*)
 add_rc_deps(rapps.rc ${rapps_rc_deps})
 add_executable(rapps ${SOURCE} rapps.rc)
-set_module_type(rapps win32cui UNICODE)
+set_module_type(rapps win32gui UNICODE)
 target_link_libraries(rapps conutils ${PSEH_LIB} uuid wine cpprt atl_classes)
 add_importlibs(rapps advapi32 comctl32 gdi32 wininet user32 shell32 shlwapi 
ole32 setupapi gdiplus msvcrt kernel32 ntdll)
 add_pch(rapps include/rapps.h SOURCE)
diff --git a/base/applications/rapps/appview.cpp 
b/base/applications/rapps/appview.cpp
index 0bdcc67cdbc..947df04d0bd 100644
--- a/base/applications/rapps/appview.cpp
+++ b/base/applications/rapps/appview.cpp
@@ -58,8 +58,14 @@ HIMAGELIST CMainToolbar::InitImageList()
     return hImageList;
 }
 
-CMainToolbar::CMainToolbar() : m_iToolbarHeight(24)
-{
+CMainToolbar::CMainToolbar()
+    : m_iToolbarHeight(24)
+    , m_dButtonsWidthMax(0)
+{
+    memset(szInstallBtn, 0, sizeof(szInstallBtn));
+    memset(szUninstallBtn, 0, sizeof(szUninstallBtn));
+    memset(szModifyBtn, 0, sizeof(szModifyBtn));
+    memset(szSelectAll, 0, sizeof(szSelectAll));
 }
 
 VOID CMainToolbar::OnGetDispInfo(LPTOOLTIPTEXT lpttt)
diff --git a/base/applications/rapps/available.cpp 
b/base/applications/rapps/available.cpp
index 6de168024dd..fa266d7f5e1 100644
--- a/base/applications/rapps/available.cpp
+++ b/base/applications/rapps/available.cpp
@@ -7,15 +7,13 @@
  *              Copyright 2017 Alexander Shaposhnikov     
([email protected])
  *              Copyright 2020 He Yang                    ([email protected])
  */
+
 #include "rapps.h"
 
 #include "available.h"
 #include "misc.h"
 #include "dialogs.h"
 
-#include <atlcoll.h>
-#include <atlsimpcoll.h>
-#include <atlstr.h>
 
  // CAvailableApplicationInfo
 CAvailableApplicationInfo::CAvailableApplicationInfo(const ATL::CStringW& 
sFileNameParam, AvailableStrings& AvlbStrings)
diff --git a/base/applications/rapps/include/unattended.h 
b/base/applications/rapps/include/unattended.h
index 301f54ab9e7..83aa2e06b9f 100644
--- a/base/applications/rapps/include/unattended.h
+++ b/base/applications/rapps/include/unattended.h
@@ -5,6 +5,8 @@
 #define CMD_KEY_FIND L"FIND"
 #define CMD_KEY_INFO L"INFO"
 #define CMD_KEY_HELP L"?"
+#define CMD_KEY_HELP_ALT L"HELP"
+
 
 const WCHAR UsageString[] = L"RAPPS \
 [/" CMD_KEY_HELP L"] \
diff --git a/base/applications/rapps/unattended.cpp 
b/base/applications/rapps/unattended.cpp
index f1589a3b544..885c604fd5e 100644
--- a/base/applications/rapps/unattended.cpp
+++ b/base/applications/rapps/unattended.cpp
@@ -20,28 +20,36 @@ BOOL MatchCmdOption(LPWSTR argvOption, LPCWSTR szOptToMacth)
     {
         if (argvOption[0] == FirstCharList[i])
         {
-            if (StrCmpIW(argvOption + 1, szOptToMacth) == 0)
-            {
-                return TRUE;
-            }
-            else
-            {
-                return FALSE;
-            }
+            return StrCmpIW(argvOption + 1, szOptToMacth) == 0;
         }
     }
     return FALSE;
 }
 
+void InitRappsConsole()
+{
+    // First, try to attach to our parent's console
+    if (!AttachConsole(ATTACH_PARENT_PROCESS))
+    {
+        // Did we already have a console?
+        if (GetLastError() != ERROR_ACCESS_DENIED)
+        {
+            // No, try to open a new one
+            AllocConsole();
+        }
+    }
+    ConInitStdStreams(); // Initialize the Console Standard Streams
+}
+
+
 BOOL HandleInstallCommand(LPWSTR szCommand, int argcLeft, LPWSTR * argvLeft)
 {
     if (argcLeft == 0)
     {
-        ConInitStdStreams(); // Initialize the Console Standard Streams
+        InitRappsConsole();
         ConResMsgPrintf(StdOut, NULL, IDS_CMD_NEED_PACKAGE_NAME, szCommand);
         return FALSE;
     }
-    FreeConsole();
 
     ATL::CSimpleArray<ATL::CStringW> PkgNameList;
 
@@ -70,11 +78,10 @@ BOOL HandleSetupCommand(LPWSTR szCommand, int argcLeft, 
LPWSTR * argvLeft)
 {
     if (argcLeft != 1)
     {
-        ConInitStdStreams(); // Initialize the Console Standard Streams
+        InitRappsConsole();
         ConResMsgPrintf(StdOut, NULL, IDS_CMD_NEED_FILE_NAME, szCommand);
         return FALSE;
     }
-    FreeConsole();
 
     ATL::CSimpleArray<ATL::CStringW> PkgNameList;
     HINF InfHandle = SetupOpenInfFileW(argvLeft[0], NULL, INF_STYLE_WIN4, 
NULL);
@@ -218,20 +225,14 @@ BOOL HandleInfoCommand(LPWSTR szCommand, int argcLeft, 
LPWSTR *argvLeft)
     return TRUE;
 }
 
-BOOL HandleHelpCommand(LPWSTR szCommand, int argcLeft, LPWSTR * argvLeft)
+VOID PrintHelpCommand()
 {
-    if (argcLeft != 0)
-    {
-        return FALSE;
-    }
-
     ConPrintf(StdOut, L"\n");
     ConResPuts(StdOut, IDS_APPTITLE);
     ConPrintf(StdOut, L"\n\n");
 
     ConResPuts(StdOut, IDS_CMD_USAGE);
     ConPrintf(StdOut, L"%ls\n", UsageString);
-    return TRUE;
 }
 
 BOOL ParseCmdAndExecute(LPWSTR lpCmdLine, BOOL bIsFirstLaunch, int nCmdShow)
@@ -246,10 +247,6 @@ BOOL ParseCmdAndExecute(LPWSTR lpCmdLine, BOOL 
bIsFirstLaunch, int nCmdShow)
 
     if (argc == 1) // RAPPS is launched without options
     {
-        // Close the console, and open MainWindow
-        FreeConsole();
-
-
         // Check for if rapps MainWindow is already launched in another process
         HANDLE hMutex;
 
@@ -275,7 +272,8 @@ BOOL ParseCmdAndExecute(LPWSTR lpCmdLine, BOOL 
bIsFirstLaunch, int nCmdShow)
 
         return TRUE;
     }
-    else if (MatchCmdOption(argv[1], CMD_KEY_INSTALL))
+
+    if (MatchCmdOption(argv[1], CMD_KEY_INSTALL))
     {
         return HandleInstallCommand(argv[1], argc - 2, argv + 2);
     }
@@ -283,9 +281,8 @@ BOOL ParseCmdAndExecute(LPWSTR lpCmdLine, BOOL 
bIsFirstLaunch, int nCmdShow)
     {
         return HandleSetupCommand(argv[1], argc - 2, argv + 2);
     }
-    
 
-    ConInitStdStreams(); // Initialize the Console Standard Streams
+    InitRappsConsole();
 
     if (MatchCmdOption(argv[1], CMD_KEY_FIND))
     {
@@ -295,14 +292,16 @@ BOOL ParseCmdAndExecute(LPWSTR lpCmdLine, BOOL 
bIsFirstLaunch, int nCmdShow)
     {
         return HandleInfoCommand(argv[1], argc - 2, argv + 2);
     }
-    else if (MatchCmdOption(argv[1], CMD_KEY_HELP))
+    else if (MatchCmdOption(argv[1], CMD_KEY_HELP) || MatchCmdOption(argv[1], 
CMD_KEY_HELP_ALT))
     {
-        return HandleHelpCommand(argv[1], argc - 2, argv + 2);
+        PrintHelpCommand();
+        return TRUE;
     }
     else
     {
         // unrecognized/invalid options
         ConResPuts(StdOut, IDS_CMD_INVALID_OPTION);
+        PrintHelpCommand();
         return FALSE;
     }
 }
diff --git a/base/applications/rapps/winmain.cpp 
b/base/applications/rapps/winmain.cpp
index 9d36df598eb..c8604ca6c9e 100644
--- a/base/applications/rapps/winmain.cpp
+++ b/base/applications/rapps/winmain.cpp
@@ -7,15 +7,10 @@
  *              Copyright 2017 Alexander Shaposhnikov      
([email protected])
  */
 #include "rapps.h"
-
 #include "unattended.h"
-
 #include "winmain.h"
-
 #include <atlcom.h>
-
 #include <gdiplus.h>
-
 #include <conutils.h>
 
 LPCWSTR szWindowClass = L"ROSAPPMGR";
@@ -63,11 +58,11 @@ VOID InitializeGDIPlus(BOOL bInitialize)
     }
 }
 
-int wmain(int argc, wchar_t *argv[])
+INT WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPWSTR 
lpCmdLine, INT nShowCmd)
 {
     BOOL bIsFirstLaunch;
     
-    InitializeAtlModule(GetModuleHandle(NULL), TRUE);
+    InitializeAtlModule(hInstance, TRUE);
     InitializeGDIPlus(TRUE);
 
     if (GetUserDefaultUILanguage() == MAKELANGID(LANG_HEBREW, SUBLANG_DEFAULT))
@@ -75,7 +70,7 @@ int wmain(int argc, wchar_t *argv[])
         SetProcessDefaultLayout(LAYOUT_RTL);
     }
 
-    hInst = GetModuleHandle(NULL);
+    hInst = hInstance;
 
     bIsFirstLaunch = !LoadSettings(&SettingsInfo);
     if (bIsFirstLaunch)
diff --git a/base/applications/rapps_com/CMakeLists.txt 
b/base/applications/rapps_com/CMakeLists.txt
new file mode 100644
index 00000000000..4e2ff5599cd
--- /dev/null
+++ b/base/applications/rapps_com/CMakeLists.txt
@@ -0,0 +1,7 @@
+project(rapps)
+
+add_executable(rapps.com main.c rapps.rc)
+set_module_type(rapps.com win32cui UNICODE)
+set_target_properties(rapps.com PROPERTIES SUFFIX "")
+add_importlibs(rapps.com msvcrt kernel32 ntdll)
+add_cd_file(TARGET rapps.com DESTINATION reactos/system32 FOR all)
diff --git a/base/applications/rapps_com/main.c 
b/base/applications/rapps_com/main.c
new file mode 100644
index 00000000000..fdb583f053d
--- /dev/null
+++ b/base/applications/rapps_com/main.c
@@ -0,0 +1,73 @@
+/*
+ * PROJECT:     ReactOS Applications Manager Command-Line Launcher (rapps.com)
+ * LICENSE:     GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
+ * PURPOSE:     Allow explorer / cmd to wait for rapps.exe when passing 
commandline arguments
+ * COPYRIGHT:   Copyright 2020 Mark Jansen ([email protected])
+ */
+
+#include <windef.h>
+#include <winbase.h>
+#include <strsafe.h>
+
+
+int run_rapps(LPWSTR cmdline)
+{
+    STARTUPINFOW si = { sizeof(si) };
+    PROCESS_INFORMATION pi = { 0 };
+    SetLastError(0);
+    if (!CreateProcessW(NULL, cmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, 
&pi))
+    {
+        fprintf(stderr, "Unable to create rapps.exe process...\n");
+        return -1;
+    }
+    CloseHandle(pi.hThread);
+    WaitForSingleObject(pi.hProcess, INFINITE);
+    DWORD dwExit;
+    GetExitCodeProcess(pi.hProcess, &dwExit);
+    CloseHandle(pi.hProcess);
+    return dwExit;
+}
+
+int wmain(int argc, wchar_t* argv[])
+{
+    WCHAR RappsExe[MAX_PATH] = { 0 };
+
+    GetModuleFileNameW(NULL, RappsExe, ARRAYSIZE(RappsExe));
+    size_t arglen = wcslen(RappsExe);
+    if (arglen > 4 && !wcsicmp(RappsExe + arglen - 4, L".com"))
+    {
+        wcscpy(RappsExe + arglen - 4, L".exe");
+    }
+    else
+    {
+        fprintf(stderr, "Unable to build rapps.exe path...\n");
+        return - 1;
+    }
+
+    arglen += (1 + 2);  // nullterminator + 2 quotes
+
+    for (int n = 1; n < argc; ++n)
+    {
+        arglen += wcslen(argv[n]);
+        arglen += 3;    // Surrounding quotes + space
+    }
+
+    wchar_t* cmdline = LocalAlloc(LMEM_ZEROINIT, arglen * sizeof(WCHAR));
+    if (cmdline)
+    {
+        wchar_t* ptr = cmdline;
+        size_t cchRemaining = arglen;
+
+        StringCchPrintfExW(ptr, cchRemaining, &ptr, &cchRemaining, 0, 
L"\"%s\"", RappsExe);
+
+        for (int n = 1; n < argc; ++n)
+        {
+            StringCchPrintfExW(ptr, cchRemaining, &ptr, &cchRemaining, 0, L" 
\"%s\"", argv[n]);
+        }
+    }
+
+    int iRet = run_rapps(cmdline);
+    if (cmdline)
+        LocalFree(cmdline);
+    return iRet;
+}
diff --git a/base/applications/rapps_com/main.ico 
b/base/applications/rapps_com/main.ico
new file mode 100644
index 00000000000..27f227da3b1
Binary files /dev/null and b/base/applications/rapps_com/main.ico differ
diff --git a/base/applications/rapps_com/rapps.rc 
b/base/applications/rapps_com/rapps.rc
new file mode 100644
index 00000000000..9282aae2b8c
--- /dev/null
+++ b/base/applications/rapps_com/rapps.rc
@@ -0,0 +1,5 @@
+#define REACTOS_STR_FILE_DESCRIPTION  "ReactOS Applications Manager console 
shim"
+#define REACTOS_STR_INTERNAL_NAME     "rapps"
+#define REACTOS_STR_ORIGINAL_FILENAME "rapps.com"
+
+#include <reactos/version.rc>

Reply via email to