CHILD.C
/******************************************************************************\ 
*       This is a part of the Microsoft Source Code Samples.  
*       Copyright (C) 1992-1996 Microsoft Corporation. 
*       All rights reserved.  
*       This source code is only intended as a supplement to  
*       Microsoft Development Tools and/or WinHelp documentation. 
*       See these sources for detailed information regarding the  
*       Microsoft samples programs. 
\******************************************************************************/ 
 
/* Standard output handle/standard error handle redirection test 
program */ 
 
#include <stdio.h> 
#include <io.h> 
#include <string.h> 
#include <windows.h> 
 
/* This function opens up a handle to CONOUT$ so that we can be 
guaranteed to get error messages to the console even if the standard 
handles are redirected. */ 
 
void myError(HANDLE h, char *api, int line) 
{ 
  char buf[512]; 
  BOOL fSuccess; 
  DWORD cBytesWritten; 
  HANDLE hConout; 
 
  sprintf(buf, "%s: Error %d from %s on line %d\n", __FILE__, GetLastError(), 
      api, line); 
  fSuccess = WriteFile(h, buf, strlen(buf), &cBytesWritten, NULL); 
  if (!fSuccess) 
    { 
    hConout = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE, 
        FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 
        FILE_ATTRIBUTE_NORMAL, NULL); 
    sprintf(buf, "%s: Error %d from %s on line %d\n", __FILE__, 
      GetLastError(), api, line); 
    WriteFile(hConout, buf, strlen(buf), &cBytesWritten, NULL); 
    CloseHandle(hConout); 
    } 
  return; 
} 
 
/* get the standard output handle and standard error handle and 
write a message to each */ 
 
int main() 
{ 
  DWORD cBytesWritten; 
  HANDLE hStdErr, hStdOut, hConout; 
  BOOL fSuccess; 
  char *stdErrMsg = "Hello from child to standard error!\n"; 
  char *stdOutMsg = "Hello from child to standard output!\n"; 
 
  hConout = CreateFile("CONOUT$", GENERIC_READ | GENERIC_WRITE, 
      FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 
      FILE_ATTRIBUTE_NORMAL, NULL); 
  if ((int) hConout == -1) 
    Beep(5000,500); /* no reliable way of reporting errors to the console */ 
                    /* if we can't open a console handle */ 
  hStdErr = GetStdHandle(STD_ERROR_HANDLE); 
  if (hStdErr == INVALID_HANDLE_VALUE) 
    myError(hConout, "GetStdHandle", __LINE__); 
  hStdOut = GetStdHandle(STD_OUTPUT_HANDLE); 
  if (hStdOut == INVALID_HANDLE_VALUE) 
    myError(hConout, "GetStdHandle", __LINE__); 
  fSuccess = WriteFile(hStdErr, stdErrMsg, strlen(stdErrMsg), 
      &cBytesWritten, NULL); 
  if (!fSuccess) 
    myError(hConout, "WriteFile", __LINE__); 
  fSuccess = WriteFile(hStdOut, stdOutMsg, strlen(stdOutMsg), 
      &cBytesWritten, NULL); 
  if (!fSuccess) 
    myError(hConout, "WriteFile", __LINE__); 
  CloseHandle(hConout); 
  return(0); 
}