PS:标准输入/标准错误 ,参考这个来弄吧。
环境:Win7(32位/64位),VC6
1、
1 int main() 2 { 3 printf("*stdin : %x\n", *stdin); 4 printf("*stdout : %x\n", *stdout); 5 printf("*stderr : %x\n", *stderr); 6 7 printf("stdin : %x\n", stdin); 8 printf("stdout : %x\n", stdout); 9 printf("stderr : %x\n", stderr);10 11 printf("GetStdHandle(STD_INPUT_HANDLE) return : %x\n", GetStdHandle(STD_INPUT_HANDLE));12 printf("GetStdHandle(STD_OUTPUT_HANDLE) return : %x\n", GetStdHandle(STD_OUTPUT_HANDLE));13 printf("GetStdHandle(STD_ERROR_HANDLE) return : %x\n", GetStdHandle(STD_ERROR_HANDLE));14 15 return 0;16 }
得到的结果为:
*stdin : 429620*stdout : 0*stderr : 0stdin : 425a30stdout : 425a50stderr : 425a70GetStdHandle(STD_INPUT_HANDLE) return : 3GetStdHandle(STD_OUTPUT_HANDLE) return : 7GetStdHandle(STD_ERROR_HANDLE) return : b
2、
中 五楼说到:
“
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
2.3、
关于上面说到的 “Peb->ProcessParameters里的 StandardInput 、StandardOutput 、StandardError”,可以使用 WinDBG查看相关结构中的相关属性值,但是暂时还未自己亲手查看验证过...
3、
PS:测试代码:
1 #include2 #include 3 4 #include 5 #include 6 7 int main() 8 { 9 printf("*stdin : %x\n", *stdin);10 printf("*stdout : %x\n", *stdout);11 printf("*stderr : %x\n", *stderr);12 printf("\n");13 14 printf("GetStdHandle(STD_INPUT_HANDLE) return : %x\n", GetStdHandle(STD_INPUT_HANDLE));15 printf("GetStdHandle(STD_OUTPUT_HANDLE) return : %x\n", GetStdHandle(STD_OUTPUT_HANDLE));16 printf("GetStdHandle(STD_ERROR_HANDLE) return : %x\n", GetStdHandle(STD_ERROR_HANDLE));17 printf("\n");18 19 STARTUPINFO si = { 0};20 si.cb = sizeof(STARTUPINFO);21 22 GetStartupInfo(&si);23 printf("si.hStdOutput(1) : %x\n", si.hStdOutput);24 25 SetStdHandle(STD_OUTPUT_HANDLE, (void*)100);26 27 GetStartupInfo(&si);28 printf("si.hStdOutput(2) : %x\n", si.hStdOutput);29 30 31 printf("\n");32 33 printf("*stdin : %x\n", *stdin);34 printf("*stdout : %x\n", *stdout);35 printf("*stderr : %x\n", *stderr);36 printf("\n");37 38 printf("GetStdHandle(STD_INPUT_HANDLE) return : %x\n", GetStdHandle(STD_INPUT_HANDLE));39 printf("GetStdHandle(STD_OUTPUT_HANDLE) return : %x\n", GetStdHandle(STD_OUTPUT_HANDLE));40 printf("GetStdHandle(STD_ERROR_HANDLE) return : %x\n", GetStdHandle(STD_ERROR_HANDLE));41 42 return 0;43 }
控制台输出:
1 *stdin : 4285e0 2 *stdout : 0 3 *stderr : 0 4 5 GetStdHandle(STD_INPUT_HANDLE) return : 3 6 GetStdHandle(STD_OUTPUT_HANDLE) return : 7 7 GetStdHandle(STD_ERROR_HANDLE) return : b 8 9 si.hStdOutput(1) : ffffffff10 si.hStdOutput(2) : ffffffff11 12 *stdin : 4285e013 *stdout : 0 // ZC: 这个值不改变的话,本进程的 标准输出流 是没有被重定向的。14 *stderr : 015 16 GetStdHandle(STD_INPUT_HANDLE) return : 317 GetStdHandle(STD_OUTPUT_HANDLE) return : 64 // ZC: 只有这个值 改变了18 GetStdHandle(STD_ERROR_HANDLE) return : b19 Press any key to continue
A