从 GUI 应用程序中调用 CRT 输出例程(在非console程序中查看printf输出)

#include "stdio.h"
#include "Fcntl.h"
#include "io.h"

AllocConsole();
int fd = _open_osfhandle((long)GetStdHandle(STD_OUTPUT_HANDLE), _O_TEXT);
FILE *file = _fdopen(fd, "w");
*stdout = *file;
int status = setvbuf(stdout, 0, _IONBF, 0 );

信息: 从 GUI 应用程序中调用 CRT 输出例程

http://support.microsoft.com/kb/105305

概要
若要使用如 printf 从一个 GUI 应用程序 () 的 C 运行时输出例程就需要创建的控制台。Win32 应用程序编程接口 (API) AllocCons...

在 GUI 应用程序启动时与在"启动"三个标准操作系统的命令处理 STD_INPUT_HANDLE、 STD_OUTPUT_HANDLE 和 STD_ERROR_HANDLE 全部"出归零"的控制台的初始化例程。在 GUI 应用程序调用 AllocConsole() 时,这些三个句柄会替换为有效的值。因此,一旦这样做是调用 GetStdHandle() 将总是返回有效的句柄值。问题在于 CRT 已经完成初始化之前您的应用程序获取调用 AllocConsole() 机会 ; 三个低 I/O 手柄 0 和 1,2 已经被安装了使用原始归零出操作系统手柄,因此所有的 CRT i/o 操作发送到无效的操作系统句柄和 CRT 输出未出现在 $ 控制台中。使用上文所述来消除此问题的解决方法。

从"启动"命令不带命令行启动 GUI 应用程序的情况下标准操作系统句柄不正确零出,但错误地继承 CMD.EXE。当应用程序的 CRT 初始化时,三个低 I/O 手柄 0 和 1,2 都初始化为使用三个句柄号 CMD.EXE 从继承的应用程序。当应用程序调用 AllocConsole() 时, 控制台的初始化例程尝试替换控制台初始化的认为是无效的标准操作系统句柄值与新的控制台中的有效的句柄值。通过巧合,因为控制台的初始化例程往往会透露相同的三个值的标准操作系统句柄控制台 initilization 将替换标准操作系统句柄值具有相同的值都有--从 CMD.EXE 继承该文件之前。因此,CRT I/O 在这种情况下工作。

值得实现能够使用 CRT 例程中从命令行运行在 GUI 应用程序不是设计使然,这可能不起作用在未来版本的 Windows NT 或 Windows。在将来的版本中您可能需要解决方法,而不只是为使用"开始 < 应用程序名称 >"启动命令行上的应用程序,而且还在命令行中使用"应用程序名称"上启动的应用程序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值