传递 boost::filesystem::p ath 到 boost::p rocess::child 会导致 Win



下面的示例代码导致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 文档中找到了有关编解码器的一些信息:

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

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

另一方面,Windows更具选择性;默认是使用 char,但如果任何参数需要wchar_t,一切都将是 转换为wchar_t。这还包括boost::filesystem::p ath。 此外,如果系统不提供字符 api(就像 Windows CE的情况(所有内容也将转换。

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

当用户具有非 ASCII 用户名(无论父进程的路径如何(时,我刚刚在 Win32 上出现了这种令人讨厌的行为。

我能找到的唯一安全解决方案是始终将子路径和所有标志作为wchar_t字符串传递。

最新更新