0

Boost.Process(使用したソースを使用したドキュメント )を使用してサービスを作成したかったのですが、libをテストしているときに、次のような単純なcmdアプリをトレースすることさえできないことがわかりました(注:同じフォルダー内でアプリを完全に起動します) 。typetype "./config.xml"

私が試したこと:

同期してみました:

#include <boost/process.hpp> 
#include <string> 
#include <vector> 
#include <iostream> 

namespace bp = ::boost::process; 

bp::child start_child() 
{ 
    std::string exec = "type \"./config.xml\""; 

    std::vector<std::string> args; 

    bp::context ctx; 
    ctx.stdout_behavior = bp::capture_stream(); 

    return bp::launch_shell(exec, args, ctx); 
} 

int main() 
{ 
    bp::child c = start_child(); 

    bp::pistream &is = c.get_stdout(); 
    std::string line; 
    while (std::getline(is, line)) 
        std::cout << line << std::endl;

    std::cin.get();
} 

また非同期:

#if defined(__CYGWIN__) 
#  define _WIN32_WINNT 0x0501 
#  define __USE_W32_SOCKETS 
#  undef BOOST_POSIX_API 
#  define BOOST_WINDOWS_API 
#endif 
#include <boost/asio.hpp> 
#define BOOST_PROCESS_WINDOWS_USE_NAMED_PIPE 
#include <boost/process.hpp> 
#include <boost/array.hpp> 
#include <boost/bind.hpp> 
#include <string> 
#include <vector> 
#include <iostream> 

namespace bp = ::boost::process; 
namespace ba = ::boost::asio; 

ba::io_service io_service; 
boost::array<char, 4096> buffer; 

#if defined(BOOST_POSIX_API) 
ba::posix::stream_descriptor in(io_service); 
#elif defined(BOOST_WINDOWS_API) 
ba::windows::stream_handle in(io_service); 
#else 
#  error "Unsupported platform." 
#endif 

bp::child start_child() 
{ 
    std::string exec = "type \"./config.xml\""; 

    bp::context ctx; 
    ctx.stdout_behavior = bp::capture_stream(); 

    return bp::launch_shell(exec, ctx); 
} 

void end_read(const boost::system::error_code &ec, std::size_t bytes_transferred); 

void begin_read() 
{ 
    in.async_read_some(boost::asio::buffer(buffer), 
        boost::bind(&end_read, ba::placeholders::error, ba::placeholders::bytes_transferred)); 
} 

void end_read(const boost::system::error_code &ec, std::size_t bytes_transferred) 
{ 
    if (!ec) 
    { 
        std::cout << std::string(buffer.data(), bytes_transferred) << std::flush; 
        begin_read(); 
    } 
} 

int main() 
{ 
    bp::child c = start_child(); 

    bp::pistream &is = c.get_stdout(); 
    in.assign(is.handle().release()); 

    begin_read(); 

    c.wait(); 

    std::cin.get();
} 

そして、私は新しいものがそこからanethigが出てくるのを見ます。Like Itはtypeストリームをまったく取得できません=((他のすべてのテストは魅力のように機能echopingましたが)Boost.Processをtypeコマンドラインアプリケーションで正しく機能させる方法はありますか?

4

1 に答える 1

0

私がwin32で思い出したことから、子プロセスに渡される最初の引数はexe名であると想定されています。また、OS は最初のパラメーターを exe 名であると想定して食べ、残りをアプリケーションに渡すと考えています。

これを参照してください:パスとCreateProcess

そしてこれ:http://msdn.microsoft.com/en-us/library/ms682425.aspx

于 2012-10-01T18:57:42.153 に答える