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

在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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值