Listing 2: PipedProcess.cpp : implementation file
#include "stdafx.h"
BOOL CPipedProcess::CreateProc(char* ExeFileName)
{
SECURITY_ATTRIBUTES saAttr;
BOOL fSuccess;
/* Set the bInheritHandle flag so pipe handles are
inherited. */
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = NULL;
/* Create a pipe for the child's STDOUT. */
if (! CreatePipe(&hChildStdoutRd, &hChildStdoutWr,
&saAttr, BUFSIZE)) {
ErrorExit("Stdout pipe creation failed");
return FALSE;
}
/* Set a write handle to the pipe to be STDOUT. */
if (! SetStdHandle(STD_OUTPUT_HANDLE, hChildStdoutWr)) {
ErrorExit("Redirecting STDOUT failed");
return FALSE;
}
/* Set a write handle to the pipe to be STDERROR */
if (! SetStdHandle(STD_ERROR_HANDLE, hChildStdoutWr)) {
ErrorExit("Redirecting STDOUT failed");
return FALSE;
}
/* Create a pipe for the child's STDIN. */
if (! CreatePipe(&hChildStdinRd, &hChildStdinWr,
&saAttr, BUFSIZE)) {
ErrorExit("Stdin pipe creation failed");
return FALSE;
}
/* Set a read handle to the pipe to be STDIN. */
if (! SetStdHandle(STD_INPUT_HANDLE, hChildStdinRd)) {
ErrorExit("Redirecting Stdin failed");
return FALSE;
}
/* Duplicate the write handle to the pipe so it is not
inherited. */
fSuccess = DuplicateHandle(GetCurrentProcess(), hChildStdinWr,
GetCurrentProcess(), &hChildStdinWrDup,
0, FALSE, DUPLICATE_SAME_ACCESS);
if (! fSuccess) {
ErrorExit("DuplicateHandle failed");
return FALSE;
}
CloseHandle(hChildStdinWr);
/* Now create the child process. */
if (! CreateChildProcess(ExeFileName)) {
ErrorExit("Create process failed");
return FALSE;
}
return TRUE;
}
void CPipedProcess::CloseChildProcess(void)
{
CloseHandle(hChildStdinRd);
CloseHandle(hChildStdinWrDup))
CloseHandle(hChildStdoutRd))
CloseHandle(hChildStdoutWr))
}
BOOL CPipedProcess::CreateChildProcess(char *ChildName)
{
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;
char TitleProc [280];
*TitleProc = '\x0';
strcat(TitleProc, "Pipe \x0");
strcat(TitleProc, ChildName);
if(strlen(TitleProc) > 20) TitleProc[18] = '\x0';
/* Set up members of STARTUPINFO structure. */
siStartInfo.cb = sizeof(STARTUPINFO);
siStartInfo.lpReserved = NULL;
siStartInfo.lpReserved2 = NULL;
siStartInfo.cbReserved2 = 0;
siStartInfo.lpDesktop = NULL;
siStartInfo.dwFlags = STARTF_USESHOWWINDOW;
siStartInfo.lpTitle = TitleProc;
siStartInfo.wShowWindow = SW_MINIMIZE;
/* Create the child process. */
return CreateProcess(NULL,
ChildName, /* command line */
NULL, /* process security attributes */
NULL, /* primary thread security attributes */
TRUE, /* handles are inherited */
0, /* creation flags */
NULL, /* use parent's environment */
NULL, /* use parent's current directory */
&siStartInfo, /* STARTUPINFO pointer */
&piProcInfo); /* receives PROCESS_INFORMATION */
}
DWORD CPipedProcess::ProcessCommand(CString Command,
CString &ResultBuf)
{
DWORD dwRead;
WriteToPipe((char*) LPCTSTR(Command));
dwRead = ReadFromPipe(ResultBuf);
return dwRead;
}
void CPipedProcess::ErrorExit (char *ErrorMsg)
{
::MessageBox(::GetActiveWindow(), ErrorMsg, "Pipe Error", MB_OK);
CloseChildProcess();
}
//End of File