1

下面的示例代码在 Windows 上导致异常:

#include <boost/filesystem.hpp>
#include <boost/process.hpp>

using namespace boost::filesystem;
using namespace boost::process;

int main()
{
  child child(exe = search_path("app", { current_path() / "app_dir" }),
              args = { "--help" });

  child.wait();

  return 0;
}

但这不是:

#include <boost/filesystem.hpp>
#include <boost/process.hpp>

using namespace boost::filesystem;
using namespace boost::process;

int main()
{
  child child(search_path("app", { current_path() / "app_dir" }).string(),
              "--help");

  child.wait();

  return 0;
}

这是异常消息:

boost codecvt to wchar_t: error

我在 Boost 文档中找到了一些关于 codecvt 的信息:

由于 windows 不使用 UTF-8,因此有时不可避免地使用 WinApi 的 wchar_t 版本。为了保持这个库的一致性,它还在 posix 上提供了 wchar_t 支持。

由于 posix api 纯粹是 char,因此每个基于 wchar_t 的类型都将转换为 char。

另一方面,Windows 更具选择性。默认是使用char,但是如果任何参数需要wchar_t,所有的东西都会被转换成wchar_t。这也包括 boost::filesystem::path。此外,如果系统不提供 char api(如 Windows CE 的情况),所有内容也将被转换。

但我认为我在这两种情况下都正确使用了子进程。你能告诉我我做错了什么吗?

4

0 回答 0