首页 > 解决方案 > 使用手动分配的控制台在 CMD.EXE 中输出混乱

问题描述

我越来越沮丧。我有一个手动打开控制台的 Windows GUI 应用程序。呼叫AllocConsole和重定向stdin,stdoutstderr所有工作都完美无缺。我可以输入任何输入和任何输出,而且效果很好。问题是当我调用_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; 
} 

我对每个手柄都这样做。

标签: windowsuser-interfacecmdwindows-console

解决方案


将打开模式从“w”更改为“r+”。为了与控制台 API 完全兼容,控制台文件应该以读写访问权限打开,这是进程分配控制台时默认打开它们的方式。例如,C 运行时isatty通过调用检测控制台句柄GetConsoleMode,这需要具有读取访问权限的句柄。如果仅使用写访问权限打开“CONOUT$”,这将失败。


推荐阅读