使用 STDIN 和 STDOUT 创建一个位于 UTF-16 管道中的子进程

问题描述 投票:0回答:2

我使用

CreateProcessW
函数创建了一个子进程,该函数的管道作为其自身与其父进程之间的 STDOUTSTDIN 。我无法使用
WriteFile
ReadFile
函数以宽字符形式发送和获取数据。

我不知道为管道设置 std::locale 。有没有一种方法可以专门告诉这些管道将数据编码为 UTF-16 中的宽字符,类似于 ifstreamsofstreams

谢谢。

windows visual-c++ process pipe utf-16
2个回答
2
投票

WriteFile 需要写入的字节数,而不是字符数。

当我用

str.size ()
替换
sizeof (wchar_t) * str.size ()
时,整个字符串就会被写入然后读出。至少当我使用带有默认参数的普通 CreatePipe 调用创建管道时。

还要确保在传递到 wprint 或 wout 之前以 NUL 终止它。


0
投票

解决方案:

我在“预处理器定义”中进行了两项更改,即添加可用的 _UNICODE_MBCS 宏,并为 std::wcin 添加 UTF-16 模式,如下所示:

const unsigned long MaxCode = 0x10FFFF;
const std::codecvt_mode Mode = (std::codecvt_mode)(std::generate_header | std::little_endian);
std::locale utf16_locale(std::wcin.getloc(), new std::codecvt_utf16<wchar_t, MaxCode, Mode>);
std::wcin.imbue (utf16_locale);
© www.soinside.com 2019 - 2024. All rights reserved.