Computer Chess Club Archives


Search

Terms

Messages

Subject: Re: Question to Windows programmers

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.