如何把标准输出重定向为指定缓冲区 http://topic.csdn.net/t/20020111/16/472320.html

  1. 比较麻烦,可以看看MSDN里面的例子。首先要保存旧的标准输入输出handle。然后设置管道的属性,管道必须是可以继承的。建立了一个管道以后,把写管道设置成标准输出。然后通过CreateProcess建立子进程。然后再把读管道设置成标准输入。则子程序对标准输出的写就会在附近成的标准读里面获得。不过改了这个handle好像对printf,gets这些没有影响的。还不如用_pipe。下面是例子,改自MSDN:   
  2.   //main.cpp   
  3.   #include   <Windows.h>   
  4.   #include   <Winbase.h>   
  5.   #include   <stdio.h>   
  6.   #include   <stdlib.h>   
  7.     
  8.   void   ErrorExit(const   char   *   lpszInfo)   
  9.   {   
  10.   perror(lpszInfo);   
  11.   exit(1);   
  12.   }   
  13.     
  14.   int   main(void)   
  15.   {   
  16.   HANDLE    hMainStdinRd,   hChildStdoutWr,hMainStdoutWr,   hChildStdinRd,     
  17.   hSaveStdin,   hSaveStdout;   
  18.     
  19.   SECURITY_ATTRIBUTES   saAttr;     
  20.   saAttr.nLength   =   sizeof(SECURITY_ATTRIBUTES);     
  21.   saAttr.bInheritHandle   =   TRUE;     
  22.   saAttr.lpSecurityDescriptor   =   NULL;     
  23.     
  24.   hSaveStdout   =   GetStdHandle(STD_OUTPUT_HANDLE);   
  25.   hSaveStdin   =   GetStdHandle(STD_INPUT_HANDLE);     
  26.     
  27.   if   (!   CreatePipe(&hMainStdinRd,   &hChildStdoutWr,   &saAttr,   0))     
  28.   ErrorExit("Stdout   pipe   creation   failed/n");     
  29.   if   (!   SetStdHandle(STD_OUTPUT_HANDLE,   hChildStdoutWr))     
  30.   ErrorExit("Redirecting   Child   STDOUT   failed");     
  31.     
  32.   if   (!   CreatePipe(&hChildStdinRd,   &hMainStdoutWr,   &saAttr,   0))     
  33.   ErrorExit("Stdin   pipe   creation   failed/n");     
  34.   if   (!   SetStdHandle(STD_INPUT_HANDLE,   hChildStdinRd))     
  35.   ErrorExit("Redirecting   Child   Stdin   failed");   
  36.     
  37.   PROCESS_INFORMATION   piProcInfo;     
  38.   STARTUPINFO   siStartInfo;     
  39.   ZeroMemory(   &piProcInfo,   sizeof(PROCESS_INFORMATION)   );   
  40.   ZeroMemory(   &siStartInfo,   sizeof(STARTUPINFO)   );   
  41.   siStartInfo.cb   =   sizeof(STARTUPINFO);   
  42.   if   (!CreateProcess(NULL,     
  43.   "child",               //   command   line     
  44.       NULL,                     //   process   security   attributes     
  45.       NULL,                     //   primary   thread   security   attributes     
  46.       TRUE,                     //   handles   are   inherited     
  47.       0,                           //   creation   flags     
  48.       NULL,                     //   use   parent's   environment     
  49.       NULL,                     //   use   parent's   current   directory     
  50.       &siStartInfo,     //   STARTUPINFO   pointer     
  51.       &piProcInfo))     //   receives   PROCESS_INFORMATION     
  52.       ErrorExit("Create   process   failed");   
  53.     
  54.   char   buf[1024]   =   "Hello   world";   
  55.   DWORD   dwWritten;     
  56.     
  57.   if   (!   SetStdHandle(STD_OUTPUT_HANDLE,   hMainStdoutWr))     
  58.   ErrorExit("Redirecting   Local   STDOUT   failed");     
  59.   if   (!   SetStdHandle(STD_INPUT_HANDLE,   hMainStdinRd))     
  60.               ErrorExit("Redirecting   Local   Stdin   failed");   
  61.     
  62.   if   (!   WriteFile(hMainStdoutWr,buf,strlen(buf),&dwWritten,   NULL))   
  63.     ErrorExit("Write   Error/n");   
  64.   if   (!   ReadFile(hMainStdinRd,buf,1023,&dwWritten,   NULL))   
  65.     ErrorExit("Read   Error/n");   
  66.     
  67.   perror(buf);   
  68.     
  69.   SetStdHandle(STD_OUTPUT_HANDLE,   hSaveStdout);   
  70.   SetStdHandle(STD_INPUT_HANDLE,   hSaveStdin);     
  71.   return   1;   
  72.   }   
  73.     
  74.   //child.cpp   
  75.   #include   <windows.h>     
  76.   #include   <stdio.h>   
  77.   #include   <stdlib.h>   
  78.     
  79.   #define   BUFSIZE   1024   
  80.   int   main(void)   
  81.   {   
  82.   perror("Begin   to   work");   
  83.   char   buf[BUFSIZE];   
  84.     
  85.   HANDLE   hStdin,   hStdout;     
  86.   DWORD   dwRead,   dwWritten;   
  87.   BOOL   fSuccess;     
  88.       
  89.   hStdout   =   GetStdHandle(STD_OUTPUT_HANDLE);     
  90.   hStdin   =   GetStdHandle(STD_INPUT_HANDLE);     
  91.   if   ((hStdout   ==   INVALID_HANDLE_VALUE)   ||     
  92.   (hStdin   ==   INVALID_HANDLE_VALUE))     
  93.   {   
  94.   perror("Error   handle");   
  95.   exit(0);   
  96.   }   
  97.   fSuccess   =   ReadFile(hStdin,   buf,   BUFSIZE,   &dwRead,   NULL);     
  98.   if   (!   fSuccess   ||   dwRead   ==   0)   
  99.   {   
  100.   perror("Error   Read");   
  101.   exit(1);   
  102.   }   
  103.       
  104.         //   Write   to   standard   output.     
  105.   buf[dwRead]   =   '/0';   
  106.   dwRead   =   strlen(strcat(buf,"Child   Get   it/n"));   
  107.   fSuccess   =   WriteFile(hStdout,   buf,   dwRead,   &dwWritten,   NULL);     
  108.   if   (!   fSuccess)     
  109.   {   
  110.   perror("Error   Write");   
  111.   exit(1);   
  112.   }   
  113.     
  114.   return   1;   
  115.   }   
  116.  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值