利用管道实现控制台程序输入输出的重定向

来源:互联网 发布:域名交易案例 编辑:程序博客网 时间:2024/05/01 07:54

在vc++6.0 创建控制台程序,编译测试通过。支持UniCode

控制台测试程序(and.exe)

#include "stdafx.h"
#include "stdio.h"

int main(int argc, char* argv[])
{
 int x,y;
// while(1)
 {
 printf("Input First Num:/r/n");
 scanf( "%d", &x );
 printf("Input Second Num:/r/n");
 scanf( "%d", &y );
 
 printf("%d + %d = %d/r/n",x,y,x+y);
 }
 return 0;
}

实现控制台输入输出重转向的控制程序(或者GUI)

#include "stdafx.h"
#include "Windows.h"
#include "stdio.h"

int main(int argc, char* argv[])
{
 SECURITY_ATTRIBUTES sa,sa2;
 HANDLE hInputRead,hInputWrite;
 HANDLE hOutputRead,hOutputWrite;
 
 sa.nLength = sizeof(SECURITY_ATTRIBUTES);
 sa.lpSecurityDescriptor = NULL;
 sa.bInheritHandle = TRUE;
 if (!CreatePipe(&hOutputRead,&hOutputWrite,&sa,0))
 {
  printf("Error On CreatePipe1");
  return 1;
 }
 
 sa2.nLength = sizeof(SECURITY_ATTRIBUTES);
 sa2.lpSecurityDescriptor = NULL;
 sa2.bInheritHandle = TRUE;
 if (!CreatePipe(&hInputRead,&hInputWrite,&sa2,0))
 {
  printf("Error On CreatePipe2");
  return 1;
 }
 
 STARTUPINFO si;
 PROCESS_INFORMATION pi;
 si.cb = sizeof(STARTUPINFO);
 GetStartupInfo(&si);
 si.hStdError = hOutputWrite;
 si.hStdOutput = hOutputWrite;
 si.hStdInput = hInputRead;
 si.wShowWindow = SW_HIDE;
 si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
 
 TCHAR cmd_line[100];
 lstrcpy(cmd_line,TEXT("d://and.exe"));
 DWORD dwWritten;
 if (!CreateProcess(NULL,cmd_line,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
 {
#ifdef UNICODE
  wprintf(TEXT("Error On CreateProcess"));
#else
  printf(TEXT("Error On CreateProcess"));
#endif
  return 1;
 }
 
 CloseHandle(hInputRead);
 CloseHandle(hOutputWrite);
 
 char  szInPut[]= ("12/r/n 34/r/n");// 输入
 WriteFile(hInputWrite, szInPut, strlen(szInPut), &dwWritten, NULL);
 
 char buffer[4096] = {0};
 DWORD bytesRead;
 while (true)
 {
  if(ReadFile(hOutputRead,buffer,4095,&bytesRead,NULL) == NULL)
  {
   break;
  }

  printf(buffer);// 输出

  Sleep(500);
 }
 CloseHandle(hInputWrite);
 CloseHandle(hOutputRead);
 return 0;
}