(1) 写一个add.exe文件,代码如下
#include "iostream"
using namespace std;
int main()
{
int a, b;
while(cin>>a>>b)
{
cout<<a+b<<endl;
}
return 0;
}
编译生成add.exe,在步骤3中会用到
(2)写一个输入文件in.txt,写入数据,
格式为每行仅有两个整数,两个整数之间用空格隔开
数据可以有多行
最后一行只有一个空字符(Tab键上面的键)
例:
2 5
45 65
1 -88
·
(3)
新建一个win32 console application空工程,再新建一个main.cpp文件,写入以下代码,编译生成相应的exe文件,
将(1)、(2)中的文件拷贝到工程main.cpp所在的目录当中和工程目录下Debug目录当中
#include "windows.h"
#include "iostream"
using namespace std;
HANDLE hRead,hWrite,dWrite,dRead;
DWORD WINAPI ThreadRead(LPVOID lpParameter) //读取线程
{
DWORD dw=-1;
char temp[4096];
while(dw != 0)
{
memset(temp,0,4096);
ReadFile(hRead,temp,4096,&dw,0);
if(dw!=0)
{
cout<<temp;
}
}
return 0;
}
void Read()
{
HANDLE handle = CreateThread(NULL, 0, ThreadRead, NULL, 0, NULL); //创建读取线程
if(! handle)
{
MessageBox(NULL,"创建线程失败","Tip",0);
return ;
}
CloseHandle(handle);
}
int main(int argc, char * argv[])
{
DWORD ErrorCode;
DWORD dw=-1;
HANDLE hFile;
OFSTRUCT FileInfo;
char ErrorString[500];
SECURITY_ATTRIBUTES sa; //创建安全信息结构体
sa.bInheritHandle=true;
sa.lpSecurityDescriptor=0;
sa.nLength=sizeof(sa);
CreatePipe(&hRead,&hWrite,&sa,4096); //创建输出管道
if(ErrorCode = GetLastError())
{
cout<<"创建输入管道失败!"<<endl;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ErrorCode, LANG_SYSTEM_DEFAULT, ErrorString, 500, NULL);
cout<<ErrorString<<endl;
return 1;
}
CreatePipe(&dRead,&dWrite,&sa,4096); //创建输入管道
if(ErrorCode = GetLastError())
{
cout<<"创建输出管道失败!"<<endl;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ErrorCode, LANG_SYSTEM_DEFAULT, ErrorString, 500, NULL);
cout<<ErrorString<<endl;
return 2;
}
hFile = (HANDLE)OpenFile("in.txt", &FileInfo, OF_READ);
if(ErrorCode = GetLastError())
{
cout<<"打开输入文件失败!"<<endl;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ErrorCode, LANG_SYSTEM_DEFAULT, ErrorString, 500, NULL);
cout<<ErrorString<<endl;
return 1;
}
STARTUPINFO si; //创建进程开始信息结构体
GetStartupInfo(&si);
si.dwFlags = STARTF_USESHOWWINDOW|STARTF_USESTDHANDLES;
si.wShowWindow = SW_HIDE;
si.hStdOutput = hWrite;
si.hStdInput = dRead;
PROCESS_INFORMATION pi; //创建进程
CreateProcess("add.exe", NULL, NULL, NULL, true, 0, NULL, NULL, &si, &pi);
if(ErrorCode = GetLastError())
{
cout<<"创建进程失败!"<<endl;
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, ErrorCode, LANG_SYSTEM_DEFAULT, ErrorString, 500, NULL);
cout<<ErrorString<<endl;
return 3;
}
char data[4096];
memset(data, 0, sizeof(data));
ReadFile(hFile, data, 4096, &dw, 0);
WriteFile(dWrite, data, strlen(data), &dw, NULL);
Read();
return 0;
}
注意:如果是映射CMD的命令,则要在每个命令字符串后追加一个换行符 ‘\n’
(4)完成以上的步骤就可以执行了,(3)中的程序就是重新定向(1)中的add.exe的输入和输出。