首页 > 系统服务 > 详细

重定位本进程的标准输出(非子进程)

时间:2015-11-09 12:15:33      阅读:198      评论:0      收藏:0      [点我收藏+]

PS:标准输入/标准错误 ,参考这个来弄吧。

 

环境:Win7(32位/64位),VC6

 

1、

    printf("*stdin : %x\n", *stdin);
    printf("*stdout : %x\n", *stdout);
    printf("*stderr : %x\n", *stderr);
    printf("stdin : %x\n", stdin);
    printf("stdout : %x\n", stdout);
    printf("stderr : %x\n", stderr);
    printf("GetStdHandle(STD_INPUT_HANDLE) return : %x\n", GetStdHandle(STD_INPUT_HANDLE));
    printf("GetStdHandle(STD_OUTPUT_HANDLE) return : %x\n", GetStdHandle(STD_OUTPUT_HANDLE));
    printf("GetStdHandle(STD_ERROR_HANDLE) return : %x\n", GetStdHandle(STD_ERROR_HANDLE));
    printf("\n");

得到的结果为:

*stdin : 429620
*stdout : 0
*stderr : 0
stdin : 425a30
stdout : 425a50
stderr : 425a70
GetStdHandle(STD_INPUT_HANDLE) return : 3
GetStdHandle(STD_OUTPUT_HANDLE) return : 7
GetStdHandle(STD_ERROR_HANDLE) return : b

 

2、

http://bbs3.driverdevelop.com/read.php?tid-98473-page-e.html 中有人说到:

SetStdHandle 仅仅是对 Peb->ProcessParameters里的 StandardInput 、StandardOutput 、StandardError 3个变量的赋值而已。

printf内部实现类似于
  sprintf(buf,format,arglist)
  fwrite(stdout,buf);

其中stdout为CRT内部变量,在初始化时已经被设置为 stdout=GetStdHandle(STD_OUTPUT_HANDLE);
(具体看CRT代码,ioinit()),所以,即使你在程序里改变了Peb->ProcessParameters里的 StandardOutput ,stdout没有变化

想重定向PRINTF之类标准库函数,想办法改变stdout吧

2.1、

我看了 _ioinit() 里面条用了 宏stdhndl,确实 在_ioinit()中,有 “GetStdHandle(STD_INPUT_HANDLE);”、“GetStdHandle(STD_OUTPUT_HANDLE);”、“GetStdHandle(STD_ERROR_HANDLE);”,但是 是如何 赋值给 stdin、stdout、stderr 的  这个没看出来...

 

2.2、

printf 

 3、

 

 

 

 

 

A

 

重定位本进程的标准输出(非子进程)

原文:http://www.cnblogs.com/CodeSkill/p/4949325.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!