为什么我不能重定向 WriteConsole 的输出?

rtp*_*pax 5 c console winapi windows-console

在下面的程序中,我使用两个不同的函数打印到控制台

#include <windows.h>

int main() {
    HANDLE h = GetStdHandle(STD_OUTPUT_HANDLE);
    DWORD byteswritten;
    WriteConsole(h, "WriteConsole", 12, &byteswritten, NULL);
    WriteFile(h, "WriteFile", 9, &byteswritten, NULL);
}
Run Code Online (Sandbox Code Playgroud)

如果当我执行这个程序并重定向它的输出使用a > out.txtora 1> out.txt什么都没有打印到控制台(如预期的那样)但内容out.txt只是

WriteFile
Run Code Online (Sandbox Code Playgroud)

允许将调用WriteFile重定向到文件和调用WriteConsole转到...无处的两者之间有什么不同

在 Windows 10 上用 gcc 和 msvc 测试

And*_*ers 7

WriteConsole 仅适用于控制台屏幕句柄,不适用于文件或管道。

如果您只编写 ASCII 内容,则可以WriteFile用于所有内容。

如果您需要编写可用于GetConsoleMode检测句柄类型的Unicode 字符,则对于不是控制台句柄的所有内容都会失败。

在执行这样的原始输出时,如果句柄被重定向到文件,您还必须处理BOM

这篇博文是在 Windows 控制台中处理 Unicode 的一个很好的起点......

  • 具体来说,在 Windows 8+ 中,“WriteConsole”请求仅受 ConDrv 控制台设备支持的 I/O 控制 (IOCTL)。其他一些设备(例如文件系统)会将此 IOCTL 作为无效参数而失败,反过来,控制台 API 会将其报告为无效句柄。在 Windows 7 及更早版本中,控制台 API 使用 LPC 而不是 ConDrv 设备,因此控制台缓冲区句柄被标记为路由到 LPC 连接,因此可以通过检查在用户模式下立即检测到(通过 API,*不是*客户端代码)低两位被设置(例如,3、7、11 等)。 (2认同)