2017-04-24 6 views
3

boost :: processを含む最近boost 1.64がリリースされました。これにより、プロセスを開始するための簡単なインタフェースが提供されます。以前は、boost :: processライブラリのスタンドアロン版を使用しました(hereを参照)。これはうまくいった。私はスタンドアロンの依存関係を取り除くことができるように、新しい版に変更したいと思います。Boost :: processウィンドウでコンソールを非表示にする

APIは少し異なりますが、すべてのものは問題なく動作します。古いバージョンでは、ウィンドウ固有のコンテキストオブジェクトを渡すことができました。これにより、プロセスによって開かれたコンソールウィンドウを隠すことができました。

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

すべてはコンソールウィンドウを隠すため除いて正常に動作します:それはこのようになります新しいバージョンを使用して

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); 

。これを達成することは可能ですか?

答えて

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

原則として、setups/error/successハンドラは(逆の)順序で呼び出されることが期待できます。つまり、ライブラリやエクステンションが特定の重要な内部ロジックに対してそのロジックを特に上書きしない限り。 – sehe

+0

@VTT:SW_HIDEまたはSW_SHOWを条件設定するためにブール値( 'bShowWindow')を取得した場合、これをどのように処理できますか?私は '(bShowWindow)を試した? :: boost :: process :: windows :: show :: boost :: process :: windows :: hide'しかし、それは '子の'構築引数としてコンパイルされません... – jpo38

関連する問題