вывод на обеих консолях одновременно ,как?
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#pragma hdrstop
#define bzero(a) memset(a,0,sizeof(a))
bool IsWinNT() //проверка запуска под NT
{
OSVERSIONINFO osv;
osv.dwOSVersionInfoSize = sizeof(osv);
GetVersionEx(&osv);
return (osv.dwPlatformId == VER_PLATFORM_WIN32_NT);
}
void ErrorMessage(char *str); //вывод информации об ошибке
//----------------------------------------------------------------------
int main()
{
char buf[1024]; //буфер ввода/вывода
STARTUPINFO si;
SECURITY_ATTRIBUTES sa;
SECURITY_DESCRIPTOR sd;
PROCESS_INFORMATION pi;
HANDLE newstdin, newstdout, read_stdout, write_stdin;
if (IsWinNT())
{
InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&sd, true, NULL, false);
sa.lpSecurityDescriptor = &sd;
}
else sa.lpSecurityDescriptor = NULL;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle = true;
if (!CreatePipe(&newstdin, &write_stdin, &sa, 0))
{
ErrorMessage("CreatePipe");
getch();
return 0;
}
if (!CreatePipe(&read_stdout, &newstdout, &sa,0))
{
ErrorMessage("CreatePipe");
getch();
CloseHandle(newstdin);
CloseHandle(write_stdin);
return 0;
}
GetStartupInfo(&si); // startupinfo для дочернего процесса
si.dwFlags = STARTF_USESTDHANDLES|STARTF_USESHOWWINDOW;
si.wShowWindow = SW_SHOW;
si.hStdOutput = newstdout;
si.hStdError = newstdout;
si.hStdInput = newstdin;
char app_spawn[] = "xcopy L:\*.* xp\\ /s /e /y";
//дочерний процесс
if (!CreateProcess(NULL, app_spawn, NULL, NULL,
TRUE,CREATE_NEW_CONSOLE, NULL,NULL, &si, &pi))
{
ErrorMessage("CreateProcess");
getch();
CloseHandle(newstdin);
CloseHandle(newstdout);
CloseHandle(read_stdout);
CloseHandle(write_stdin);
return 0;
}
unsigned long exit=0; //код завершения процесса
unsigned long bread; //кол-во прочитанных байт
unsigned long avail; //кол-во доступных байт
bzero(buf);
for(;;) //основной цикл программы
{
GetExitCodeProcess(pi.hProcess, &exit);
if (exit != STILL_ACTIVE)
break;
PeekNamedPipe(read_stdout, buf, 1023, &bread, &avail, NULL);
if (bread != 0)
{
bzero(buf);
if (avail > 1023)
{
while (bread >= 1023)
{
ReadFile(read_stdout, buf, 1023, &bread, NULL);
printf("%s", buf);
bzero(buf);
}
}
else
{
ReadFile(read_stdout, buf, 1023, &bread, NULL);
printf("%s", buf);
}
}
}
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
CloseHandle(newstdin);
CloseHandle(newstdout);
CloseHandle(read_stdout);
CloseHandle(write_stdin);
}
//------------------------------------------------------------------
void ErrorMessage(char *str)
{
LPVOID msg;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // язык по умолчанию
(LPTSTR) &msg,
0,
NULL
);
printf("%s: %s\n",str,msg);
LocalFree(msg);
}
//----------------------------EOF-----------------------------------
//------------------------------------------------------------------