Author: Rémi Coulom
Date: 00:30:54 06/29/04
Go up one level in this thread
It seems that what you want to do is what winboard does with winboard engines.
You might find the solution to your problem by taking a look at its source. I
also did something similar with my auto232 tools, but it was from a console
application, so I am not sure it will do what you want. I have appended the
relevant piece of code. The rest of my source is available from my home page
(http://remi.coulom.free.fr/programs0046.tar.gz, in wbengine.cpp).
Rémi
////////////////////////////////////////////////////////////////////////////
// Start the child engine
////////////////////////////////////////////////////////////////////////////
void CWinboardEngine::StartChild()
{
TerminateChild();
//
// Set the bInheritHandle flag so pipe handles are inherited.
//
SECURITY_ATTRIBUTES saAttr;
saAttr.nLength = sizeof(SECURITY_ATTRIBUTES);
saAttr.bInheritHandle = TRUE;
saAttr.lpSecurityDescriptor = 0;
//
// Redirect child process's STDOUT:
//
HANDLE hSaveStdout = GetStdHandle(STD_OUTPUT_HANDLE);
{
HANDLE hChildStdoutRd;
CreatePipe(&hChildStdoutRd, &hChildStdoutWr, &saAttr, 0);
SetStdHandle(STD_OUTPUT_HANDLE, hChildStdoutWr);
DuplicateHandle(GetCurrentProcess(),
hChildStdoutRd,
GetCurrentProcess(),
&hChildStdoutRdDup ,
0,
FALSE,
DUPLICATE_SAME_ACCESS);
CloseHandle(hChildStdoutRd);
}
//
// Redirect child process's STDIN:
//
HANDLE hSaveStdin = GetStdHandle(STD_INPUT_HANDLE);
{
HANDLE hChildStdinWr;
CreatePipe(&hChildStdinRd, &hChildStdinWr, &saAttr, 0);
SetStdHandle(STD_INPUT_HANDLE, hChildStdinRd);
DuplicateHandle(GetCurrentProcess(),
hChildStdinWr,
GetCurrentProcess(),
&hChildStdinWrDup,
0,
FALSE,
DUPLICATE_SAME_ACCESS);
CloseHandle(hChildStdinWr);
}
//
// Now create the child process.
//
{
STARTUPINFO siStartInfo;
ZeroMemory(&siStartInfo, sizeof(STARTUPINFO));
siStartInfo.cb = sizeof(STARTUPINFO);
fHasChild = CreateProcess(0,
(char *)sCommandLine.c_str(), //???
0,
0,
TRUE,
0,
0,
sDirectory.c_str(),
&siStartInfo,
&piProcInfo);
}
//
// After process creation, restore the saved STDIN and STDOUT.
//
SetStdHandle(STD_INPUT_HANDLE, hSaveStdin);
SetStdHandle(STD_OUTPUT_HANDLE, hSaveStdout);
if (fHasChild) {
//
// Create the reader thread
//
ResetEvent(hLineProcessed);
ResetEvent(hLineRead);
fStopThread = 0;
hThread = CreateThread(0, 0, ReaderThread, this, 0, &dwThread);
if (!hThread)
TerminateChild();
}
}
This page took 0 seconds to execute
Last modified: Thu, 15 Apr 21 08:11:13 -0700
Current Computer Chess Club Forums at Talkchess. This site by Sean Mintz.