C++標準入出力リダイレクト


//ProcessStdInOut.cpp
//  :
//    argv[1]                  
//    argv[2]      StdIn     
//    argv[3]      StdOut     
//    ProcessStdInOut C:\test.exe my_in.in my_out.out
//  :
//    cl ProcessStdInOut.cpp
//  :
//                        ,
//                         

#include <stdio.h>
#include <windows.h>
#define BUFSIZE 4096
int main(int argc, char *argv[])
{
	// CreatePipe、CreateProcess Create     ,
	//      SECURITY_ATTRIBUTES     
	SECURITY_ATTRIBUTES saAttr = {0};
	saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
	//      bInheritHandle   TRUE,
	//                。
	//  , CreatePipe        CreateProcess     
	saAttr.bInheritHandle = TRUE; 
	saAttr.lpSecurityDescriptor = NULL;
	
	//ChildIn_Write         ,ChildIn_Read                
	HANDLE ChildIn_Read, ChildIn_Write;
	CreatePipe(&ChildIn_Read, &ChildIn_Write, &saAttr, 0);
	//                   :ChildIn_Write
	SetHandleInformation(ChildIn_Write, HANDLE_FLAG_INHERIT, 0);
	//ChildOut_Write         ,ChildOut_Read                
	HANDLE ChildOut_Read, ChildOut_Write;
	CreatePipe(&ChildOut_Read, &ChildOut_Write, &saAttr, 0);
	//                   :ChildOut_Read
	SetHandleInformation(ChildOut_Read, HANDLE_FLAG_INHERIT, 0);
	
	//CreateProcess      
	STARTUPINFO StartupInfo = {0};
	StartupInfo.cb = sizeof(STARTUPINFO);
	//                  ChildOut_Write 
	StartupInfo.hStdError = ChildOut_Write; 
	StartupInfo.hStdOutput = ChildOut_Write;
	//             ChildIn_Read 
	StartupInfo.hStdInput = ChildIn_Read;
	//       StdIn  StdOut    
	StartupInfo.dwFlags |= STARTF_USESTDHANDLES;
	
	//CreateProcess      
	PROCESS_INFORMATION ProcessInfo = {0};
	
	CreateProcess(NULL, argv[1], NULL, NULL, TRUE, NULL, NULL, NULL, &StartupInfo, &ProcessInfo);
	
	//      ,              
	HANDLE InputFile = CreateFile(argv[2], GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
	BOOL flag = FALSE;
	while (true)
	{
		char buffer[BUFSIZE] = {0};
		DWORD BytesRead, BytesWritten;
		//     
		flag = ReadFile(InputFile, buffer, BUFSIZE, &BytesRead, NULL);
		if (!flag || (BytesRead == 0)) break;
		//      
		flag = WriteFile(ChildIn_Write, buffer, BytesRead, &BytesWritten, NULL);
		if (!flag) break;
	}
	CloseHandle(InputFile);
	//          ,          ,         
	CloseHandle(ChildIn_Write);
	
	//            
	
	//          ,          ,         
	CloseHandle(ChildOut_Write);
	//          ,          
	HANDLE OutputFile = CreateFile(argv[3], GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
	while (true)
	{
		char buffer[BUFSIZE] = {0};
		DWORD BytesRead, BytesWritten;
		//      
		flag = ReadFile(ChildOut_Read, buffer, BUFSIZE, &BytesRead, NULL);
		if (!flag || (BytesRead == 0)) break;
		//     
		flag = WriteFile(OutputFile, buffer, BytesRead, &BytesWritten, NULL);
		if (!flag) break;
	}
	CloseHandle(OutputFile);
	
	return 0;
}