2017-04-24 157 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