windows - 使用手动分配的控制台在 CMD.EXE 中输出混乱
问题描述
我越来越沮丧。我有一个手动打开控制台的 Windows GUI 应用程序。呼叫AllocConsole
和重定向stdin
,stdout
和stderr
所有工作都完美无缺。我可以输入任何输入和任何输出,而且效果很好。问题是当我调用_wsystem
运行 CMD 命令时,输出是垃圾。人物杂乱无章。CMD 没有与控制台无缝集成。
我将输出重定向到控制台,如下所示:
consoleHandleOut = GetStdHandle(STD_OUTPUT_HANDLE);
if (consoleHandleOut != INVALID_HANDLE_VALUE) {
//freopen("CONOUT$", "w", stdout);
freopen_s(&newStream, "CONOUT$", "w", stdout);
setvbuf(stdout, NULL, _IONBF, 0);
SetStdHandle(STD_OUTPUT_HANDLE,
(HANDLE)_get_osfhandle(_fileno(newStream)));
} else {
return FALSE;
}
我对每个手柄都这样做。
解决方案
将打开模式从“w”更改为“r+”。为了与控制台 API 完全兼容,控制台文件应该以读写访问权限打开,这是进程分配控制台时默认打开它们的方式。例如,C 运行时isatty
通过调用检测控制台句柄GetConsoleMode
,这需要具有读取访问权限的句柄。如果仅使用写访问权限打开“CONOUT$”,这将失败。
推荐阅读
- terraform - 通过 terraform 创建 AWS APIGateway 时出现 BadRequestException
- webhooks - SendGrid Webhook 事件自定义标头
- flutter - Flutter setState 更改状态,但不会重新渲染
- xml - 复制节点后创建元素
- html - 使用 HTML 使表格行不可点击
- xml - 使用 XPath 获取 XML 部分
- haskell - 当 newtype 是 Functor 时,是否会删除对 fmap 的调用?
- docker - Docker不断创建具有root权限的文件夹
- python - 如何在 Django 模型中使用查询?
- python - 如何减少这个嵌套 for 循环的运行时间?