From 5a8adeb7583b98c2e82eb708102c9973f3a05379 Mon Sep 17 00:00:00 2001 From: Santiago Date: Sat, 19 Aug 2023 08:55:29 +0200 Subject: [PATCH] Added 'call' overload (#89) * Added 'call' overload * Use CREATE_NO_WINDOW flag for process creation in Win32 * Change way of quoting arguments so explorer /select can be called (should find a better way to do this) --------- Co-authored-by: Santiago --- subprocess.hpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/subprocess.hpp b/subprocess.hpp index aaed3c7..6f91090 100755 --- a/subprocess.hpp +++ b/subprocess.hpp @@ -178,9 +178,9 @@ namespace util // need to do so --- hopefully avoid problems if programs won't // parse quotes properly // - - if (force == false && argument.empty() == false && - argument.find_first_of(L" \t\n\v\"") == argument.npos) { + bool containsCharThatNeedsQuoting = argument.find_first_of(L" \t\n\v\"") != argument.npos; + bool containsCharThatNeedsNoQuoting = argument.find_first_of(L"/") != argument.npos; + if (!force && !argument.empty() && (!containsCharThatNeedsQuoting || containsCharThatNeedsNoQuoting)) { command_line.append(argument); } else { @@ -1514,7 +1514,7 @@ inline void Popen::execute_process() noexcept(false) for (auto arg : this->vargs_) { argument = converter.from_bytes(arg); - util::quote_argument(argument, command_line, true); + util::quote_argument(argument, command_line, false); command_line += L" "; } @@ -1524,7 +1524,7 @@ inline void Popen::execute_process() noexcept(false) PROCESS_INFORMATION piProcInfo; STARTUPINFOW siStartInfo; BOOL bSuccess = FALSE; - DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT; + DWORD creation_flags = CREATE_UNICODE_ENVIRONMENT | CREATE_NO_WINDOW; // Set up members of the PROCESS_INFORMATION structure. ZeroMemory(&piProcInfo, sizeof(PROCESS_INFORMATION)); @@ -2050,6 +2050,12 @@ int call(const std::string& arg, Args&&... args) return (detail::call_impl(arg, std::forward(args)...)); } +template +int call(std::vector plist, Args &&... args) +{ + return (detail::call_impl(plist, std::forward(args)...)); +} + /*! * Run the command with arguments and wait for it to complete.