c++ - "printf"在 Windows 非控制台应用程序中写在哪里?

标签 c++ c winapi visual-c++ stdout

如果我选择创建一个 Windows 非控制台应用程序,并在代码中实现 printf/cout,那么 printf/cout 写在哪里?它是否写入 stdout 缓冲区?如果是,有没有办法从 stdout 读取它并将其打印到某个文本文件或使用文本执行 MessageBox (只是为了验证我是否已正确阅读)?

编辑:: 只是为了澄清我不想将输出重定向到任何地方。我想知道,printf/cout 写在哪里?如果它写入某个默认缓冲区,有没有办法读取输出,只是为了验证我是否从正确的缓冲区读取了正确的输出。 请不要给我重定向“stdout”的解决方案

最佳答案

在 Windows 下,stdout 是访问 GetStdHandle(STD_OUTPUT_HANDLE) 返回的句柄的低级函数的封装。

当通过双击启动非控制台应用程序时(我在 Windows 7 64 位下尝试过),然后 GetStdHandle(STD_OUTPUT_HANDLE) 将返回无效句柄。这意味着 printf 和其他命令将什么都不写,但 printf 内部调用的低级函数将返回错误代码。

然而,正如已经说过的,即使是非控制台程序也可以通过以下方式启动:

program_name > output_file.txt

在这种情况下,printf 输出将被写入输出文件。

-- 编辑--

如果您希望“捕获”printf() 输出并将其写入 MessageBox(),有两种方法可以实现:

第一个运行程序两次,而一个实例的输入是另一个实例的标准输出。该行为可以通过以下命令行来解释:

program_name | program_name /msgbox

第二种可能性在不运行两个程序且不运行程序两次的情况下有效:您可以 Hook 文件句柄#1。使用 msvcrt.dll 时,这至少应该是可能的:

HANDLE hRead,hWrite;

CreatePipe(&hRead,&hWrite,NULL,0);
dup2(_open_osfhandle(hWrite,O_WRONLY),1);

// Now printf() output can be read from handle hRead

printf("Hello world 2!\n");

// In a separate thread do:
ReadFile(hRead,...);

关于c++ - "printf"在 Windows 非控制台应用程序中写在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21646641/

相关文章:

c++ - 从 libpng 加载的 png 纹理在 OpenGL 中显示为黑色

c - C中的图算法通过将网格读入数组

c - int * 和 double ** 对于 C 函数参数之外的元素意味着什么?

c - 从文件中读取 int 时使用重新分配的数组运行代码时出错

c# - 在 C# 中查看非托管 dll 上的导出表

c++ - 可视化 C++ 数据结构

c++ - 编译返回字符串 & 的函数的问题

c++ - 在 Code::Blocks 项目中更新 Box2D - <找不到 Box2D/Box2D>

c++ - 创建一个窗口应用程序,每 10 分钟执行一次特定操作

c++ - 如何让COM宿主进程避免继承父进程的环境变量