Abh*_*eet 19 c c++ winapi stdout visual-c++
如果我选择创建一个Windows非控制台应用程序,并printf\cout在代码中实现,那么printf\cout写在哪里?它写入stdout缓冲区吗?如果是的话,无论如何都要从中读取它stdout并将其打印到某个文本文件中或者MessageBox使用文本进行读取(只是为了验证我是否正确读取了它)?
编辑::只是为了澄清我不想将输出重定向到任何地方.我想知道,printf/cout写在哪里?如果它写入某个默认缓冲区,是否有办法读取输出,只是为了验证我已经从正确的缓冲区读取了正确的输出.请不要给我重定向"stdout"的解决方案.
Mar*_*nau 16
在Windows下stdout是访问返回的句柄的低级函数的包装器GetStdHandle(STD_OUTPUT_HANDLE).
通过双击(我在Windows 7,64位下尝试)启动非控制台应用程序时,GetStdHandle(STD_OUTPUT_HANDLE)将返回无效句柄.这意味着,printf其他命令根本不会写入任何内容,但内部调用的低级函数printf将返回错误代码.
然而,正如已经说过的,即使是非控制台程序也可以通过以下方式启动:
program_name > output_file.txt
Run Code Online (Sandbox Code Playgroud)
在这种情况下,printf输出将写入输出文件.
- 编辑 -
如果您希望"捕获" printf()输出并将其写入,MessageBox()则有两种方法可以实现此目的:
第一个是运行程序两次,而一个实例的输入是另一个实例的标准输出.可以通过以下命令行解释该行为:
program_name | program_name /msgbox
Run Code Online (Sandbox Code Playgroud)
第二种可能性无需运行两个程序,也无需运行程序两次:您可以挂钩文件句柄#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,...);
Run Code Online (Sandbox Code Playgroud)
DNT*_*DNT 11
由于您的问题似乎只是为了获取信息,因此没有控制台的Windows应用程序的stdout,stderr句柄已关闭.尝试输出到这些句柄的任何函数,只需调用,检查打开的句柄,找到它关闭,并返回而不做任何其他操作.
你可能会说,在这种情况下你的输出最终无处可寻:)
如果要读取此输出,则需要通过分配控制台或使用此处描述的方法之一来打开句柄.
| 归档时间: |
|
| 查看次数: |
7731 次 |
| 最近记录: |