вывод на обеих консолях одновременно

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Ответить
clyck
Сообщения: 2
Зарегистрирован: 07 дек 2005, 12:11

вывод на обеих консолях одновременно ,как?

#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-----------------------------------

//------------------------------------------------------------------
clyck
Сообщения: 2
Зарегистрирован: 07 дек 2005, 12:11

Я не не написал ни одной не вразумительной не проги ни на C++,ни 0,5 на не Делфи 3.
Ответить