2013-01-05 51 views
3

我調用批處理腳本通過cmd.exe /CBoost.processboost.process批處理腳本無法運行其他程序

boost::process::context context; 
    context.stdout_behavior = boost::process::capture_stream(); 

#ifdef WIN32 
    arguments.push_front("/c"); 
    arguments.push_front(_script); 
    boost::process::child external_process = boost::process::launch("cmd.exe", arguments, context); 
#else 
    boost::process::child external_process = boost::process::launch(_script, arguments, context);  
#endif  
    boost::process::status status_code = external_process.wait(); 

如果我直接調用批處理文件,即使CMD.EXE/C,它調用外部執行程序

但是,當通過我的程序調用批處理腳本時,它根本不會調用外部程序。 外部可執行文件生成一些文件。也打印一些文本到標準輸出。我沒有看到這些文本,我看不到任何文件要生成。

我甚至已經試過notepad.exe替換目標可執行文件,然後出現一個消息框Application failed to initialize properly (0xc0150004) click on OK to terminate application

回答

2

我發現是boost::process::context是不是跨平臺的。我必須在Windows上使用boost::process::win32_context。可能是silence_stream存在問題,或者可能是我身邊的問題。

//I've a list of argv in arguments 

#ifdef WIN32 
    arguments.pop_front(); 
    arguments.push_front(_script); 
    arguments.push_front("/C"); 
    arguments.push_front("script.bat"); 

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

    boost::process::child external_process = boost::process::win32_launch(std::string("C:/Windows/System32/cmd.exe"), arguments, win32_context); 
#else 
    boost::process::context context; 
    context.stdout_behavior = boost::process::silence_stream(); 

    boost::process::child external_process = boost::process::launch(_script, arguments, context); 
#endif 

    boost::process::status status_code = external_process.wait(); 

它沒有得到PATH所以申請被無法找到dllwin32_context.environment = boost::process::self::get_environment()解決了這個問題。