boost.prrocess批处理脚本无法运行其他程序

boost.process batch script is not able to to run another program

本文关键字:运行 其他 程序 prrocess 批处理 脚本 boost      更新时间:2023-10-16

我正在使用Boost.process 通过cmd.exe /C调用批处理脚本

  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,它也会调用外部可执行文件。

但是当批处理脚本通过我的程序调用时,它根本不会调用外部程序。外部可执行文件生成一些文件。还将一些文本打印到stdout。我既没有看到这些文本,也没有看到任何要生成的文件。

我甚至尝试用notepad.exe替换目标可执行文件,然后出现一个消息框Application failed to initialize properly (0xc0150004) click on OK to terminate application

我发现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()解决了这个问题。