2017-04-24 175 views
3

最近boost 1.64发布,包括boost :: process。这为启动流程提供了一个简单的界面。以前我使用boost :: process库的独立版本(请参阅here)。这很好。我想更改为新版本,以便我可以放弃独立依赖项。Boost :: windows隐藏控制台

该API有点不同,但一切工作正常,除了事情。在旧版本中,我能够传递一个特定于窗口的上下文对象,这允许我隐藏进程打开的任何控制台窗口。

boost::process::win32_context ctx; 
ctx.environment = boost::process::self::get_environment(); 

STARTUPINFOA stup; 
ZeroMemory(&stup, sizeof(stup)); 
stup.cb = sizeof(stup); 
stup.dwFlags = STARTF_USESHOWWINDOW; 
stup.wShowWindow = SW_HIDE; 
ctx.startupinfo = &stup; 

std::vector<std::string> args; 
boost::process:child process = boost::process::win32_launch("myprogram", args, ctx); 

使用新的版本,它看起来是这样的:

boost::process::environment env = boost::this_process::environment(); 
boost::process:child process(boost::filesystem::path("myprogram"), env); 

一切正常,除了隐藏控制台窗口的罚款。是否有可能实现这一目标?

回答

3

child构造函数接受一个类型列表,该列表稍后将使用花哨的::boost::fusion方法转换为执行实际初始化的调用链。所以,你可以只是把支持一种论点以任意顺序:

#include <boost/process.hpp> 
#include <boost/process/windows.hpp> // for windows::hide that can only be used on Windows 

... 

::boost::process::environment env = ::boost::this_process::environment(); 
::boost::process::child ch1("cmd", env, ::boost::process::windows::hide); // ok 
::boost::process::child ch2(::boost::filesystem::path("C:\\Windows\\System32\\cmd.exe"), ::boost::process::windows::hide, env); // fine too 

隐藏窗口条件不是那么简单,但因为windows::hidewindows::show是不同类型的,并且不能在同一功能的参数传递。在这种情况下,需要编写自定义设置处理程序:

struct show_window 
: ::boost::process::detail::handler_base 
{ 
    private: ::boost::detail::winapi::WORD_ const m_flag; 

    public: explicit 
    show_window(bool const show) noexcept 
    : m_flag{show ? ::boost::detail::winapi::SW_SHOWNORMAL_ : ::boost::detail::winapi::SW_HIDE_} 
    {} 

    // this function will be invoked at child process constructor before spawning process 
    template <class WindowsExecutor> 
    void on_setup(WindowsExecutor &e) const 
    { 
     // we have a chance to adjust startup info 
     e.startup_info.dwFlags |= ::boost::detail::winapi::STARTF_USESHOWWINDOW_; 
     e.startup_info.wShowWindow |= m_flag; 
    } 
}; 

auto const need_to_show{false}; 
auto env{::boost::this_process::environment()}; 
::boost::process::child ch("cmd", env, show_window{need_to_show}); 
+1

这比旧图书馆好得多! –

+1

请注意 - 原则上可以预期设置/错误/成功处理程序以(反向)顺序调用。也就是说,除非库或扩展特别针对某些关键的内部逻辑覆盖该逻辑。 – sehe

+0

@VTT:如果他得到一个布尔型('bShowWindow')来条件设置SW_HIDE或SW_SHOW,怎么处理这个?我试过'(bShowWindow)? :: boost :: process :: windows :: show :: :: boost :: process :: windows :: hide'但它不能编译为子结构参数... – jpo38