下面的示例代码在 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 的情况),所有内容也将被转换。
但我认为我在这两种情况下都正确使用了子进程。你能告诉我我做错了什么吗?