https://git.reactos.org/?p=reactos.git;a=commitdiff;h=964c22c1cae372ad656220...
commit 964c22c1cae372ad6562207fcbffa67c193dd501 Author: Mark Jansen mark.jansen@reactos.org AuthorDate: Sun Sep 20 22:18:08 2020 +0200 Commit: Mark Jansen mark.jansen@reactos.org 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 (sanchaez@reactos.org) * Copyright 2020 He Yang (1160386205@qq.com) */ + #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::CSimpleArrayATL::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::CSimpleArrayATL::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 (sanchaez@reactos.org) */ #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 (mark.jansen@reactos.org) + */ + +#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>