如果我选择创建一个 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/