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