Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

захват консольных месаг (С++)

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> захват консольных месаг (С++)
Имя
Сообщение << Старые топики   Новые топики >>
захват консольных месаг (С++) - 2008-01-24 00:47:05.686666   
weiss

Сообщений: 23
Оценки: 0
Присоединился: 2007-11-28 14:55:35.510000
привет народ! нужно написать графический фронтенд к консольной тузле, может кто-то подсказать как после ее запуска перехватить ее вывод, чтобы отобразить в графической оболочке? может не совсем ясно обьяснил но по другому не могу - пиво рулит;)
Post #: 1
RE: захват консольных месаг (С++) - 2008-01-24 07:19:18.966666   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
pipe
Post #: 2
RE: захват консольных месаг (С++) - 2008-01-24 09:24:47.800000   
blаcksun

Сообщений: 1670
Оценки: 0
Присоединился: 2007-11-19 20:03:45.703333
На делфи: (код не мой)

quote:


const H_IN_READ = 1; H_IN_WRITE = 2; H_OUT_READ = 3; H_OUT_WRITE = 4; H_ERR_READ = 5; H_ERR_WRITE = 6; type TPipeHandles = array [1..6] of THandle; var hPipes: TPipeHandles; ProcessInfo: TProcessInformation; (************CREATE HIDDEN CONSOLE PROCESS************) function CreateHiddenConsoleProcess(szChildName: string; ProcPriority: DWORD; ThreadPriority: integer): Boolean; label error; var fCreated: Boolean; si: TStartupInfo; sa: TSecurityAttributes; begin // Initialize handles hPipes[ H_IN_READ ] := INVALID_HANDLE_VALUE; hPipes[ H_IN_WRITE ] := INVALID_HANDLE_VALUE; hPipes[ H_OUT_READ ] := INVALID_HANDLE_VALUE; hPipes[ H_OUT_WRITE ] := INVALID_HANDLE_VALUE; hPipes[ H_ERR_READ ] := INVALID_HANDLE_VALUE; hPipes[ H_ERR_WRITE ] := INVALID_HANDLE_VALUE; ProcessInfo.hProcess := INVALID_HANDLE_VALUE; ProcessInfo.hThread := INVALID_HANDLE_VALUE; // Create pipes // initialize security attributes for handle inheritance (for WinNT) sa.nLength := sizeof(sa); sa.bInheritHandle := TRUE; sa.lpSecurityDescriptor := nil; // create STDIN pipe if not CreatePipe( hPipes[ H_IN_READ ], hPipes[ H_IN_WRITE ], @sa, 0 ) then goto error; // create STDOUT pipe if not CreatePipe( hPipes[ H_OUT_READ ], hPipes[ H_OUT_WRITE ], @sa, 0 ) then goto error; // create STDERR pipe if not CreatePipe( hPipes[ H_ERR_READ ], hPipes[ H_ERR_WRITE ], @sa, 0 ) then goto error; // process startup information ZeroMemory(Pointer(@si), sizeof(si)); si.cb := sizeof(si); si.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES; si.wShowWindow := SW_HIDE; // assign "other" sides of pipes si.hStdInput := hPipes[ H_IN_READ ]; si.hStdOutput := hPipes[ H_OUT_WRITE ]; si.hStdError := hPipes[ H_ERR_WRITE ]; // Create a child process try fCreated := CreateProcess( nil, PChar(szChildName), nil, nil, True, ProcPriority, // CREATE_SUSPENDED, nil, nil, si, ProcessInfo ); except fCreated := False; end; if not fCreated then goto error; Result := True; CloseHandle(hPipes[ H_OUT_WRITE ]); CloseHandle(hPipes[ H_ERR_WRITE ]); // ResumeThread( pi.hThread ); SetThreadPriority(ProcessInfo.hThread, ThreadPriority); CloseHandle( ProcessInfo.hThread ); Exit; //----------------------------------------------------- error: ClosePipes( hPipes ); CloseHandle( ProcessInfo.hProcess ); CloseHandle( ProcessInfo.hThread ); ProcessInfo.hProcess := INVALID_HANDLE_VALUE; ProcessInfo.hThread := INVALID_HANDLE_VALUE; Result := False; end;
Post #: 3
RE: захват консольных месаг (С++) - 2008-01-24 15:12:57.756666   
weiss

Сообщений: 23
Оценки: 0
Присоединился: 2007-11-28 14:55:35.510000
хех, как раз пытаюсь слезть с дельфина и пересесть на VC++ :)В любом случае сенкс… надо msdn ставить короче8|
Post #: 4
RE: захват консольных месаг (С++) - 2008-01-24 16:13:33.696666   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: blаcksun
На делфи: (код не мой)

Это радует, что не твой.
include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; int main () { FILE *child = popen ("ls", "r"); char buf[81]; /* буфер ограничен в размерах, но давайте поверим в то * что все длина всех строк вывода будут &lt;=80 ;) */ if (!child) { perror ("popen"); exit (1); } while (!feof (child)) { fgets (buf, 80, child); printf ("Line readed:\n&gt; %s", buf); } fclose (child); return 0; }
Post #: 5
RE: захват консольных месаг (С++) - 2008-01-24 16:58:19.090000   
Absurd

Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666
2rgo: Сомневаюсь, что на MSVC++ это будет работать. А blacksun привел пример из MSDN переделанный на Дельфи. Хотя, с другой стороны система была не указала.
Post #: 6
RE: захват консольных месаг (С++) - 2008-01-24 17:41:55.996666   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: Absurd
2rgo: Сомневаюсь, что на MSVC++ это будет работать. А blacksun привел пример из MSDN переделанный на Дельфи. Хотя, с другой стороны система была не указала.

а ты попробуй. Я тоже сомневаюсь, но совсем чуть-чуть. popen – это нечто вроде system, очень популярно и распространено. Не думаю чтобы ms не включила это дело в свою реализацию стандартной C-шной библиотеки.
Post #: 7
RE: захват консольных месаг (С++) - 2008-01-24 22:10:47.556666   
Absurd

Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666

quote:

ORIGINAL: rgo

quote:

ORIGINAL: Absurd
2rgo: Сомневаюсь, что на MSVC++ это будет работать. А blacksun привел пример из MSDN переделанный на Дельфи. Хотя, с другой стороны система была не указала.

а ты попробуй. Я тоже сомневаюсь, но совсем чуть-чуть. popen – это нечто вроде system, очень популярно и распространено. Не думаю чтобы ms не включила это дело в свою реализацию стандартной C-шной библиотеки.

Ну то что в MSVC++ позиксовые функции начинаются с подчеркивания, типа "_popen()" я уверен на 100%. Во - вторых оно будет работать скорее всего криво - откроется пустое консольное окно или будет еще какая-то бяка. В Win95/98/ME перенаправление потоков не работало и с тех пор у них никакой мотивации полировать этот сегмент C Runtime не было (ИМХО).

PS: MSVC в данный момент под рукой нет.
Post #: 8
RE: захват консольных месаг (С++) - 2008-01-27 12:29:42.493333   
weiss

Сообщений: 23
Оценки: 0
Присоединился: 2007-11-28 14:55:35.510000
_popen() работает, спс за подсказку, но консоль не открывается, буду думать дальше :)
Post #: 9
RE: захват консольных месаг (С++) - 2008-01-27 19:02:54.453333   
rgo

Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
quote:

ORIGINAL: weiss
_popen() работает, спс за подсказку, но консоль не открывается, буду думать дальше :)

а зачем тебе открытая консоль? Приложение будет писать в пайп вместо консоли, то есть консоль не нужна абсолютно.
Post #: 10
RE: захват консольных месаг (С++) - 2008-01-29 05:28:57.066666   
crbunny

Сообщений: 223
Оценки: 0
Присоединился: 2006-06-22 21:20:01
Хе-хе, я вот сразу подумал - файл нашару открыть и в него перенаправлять, а вот оно какое красивое решение есть. POSIX говоришь. Сейчас в никсе проверю :D
Post #: 11
RE: захват консольных месаг (С++) - 2008-01-30 10:27:24.233333   
Absurd

Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666
quote:

ORIGINAL: crbunny

Хе-хе, я вот сразу подумал - файл нашару открыть и в него перенаправлять, а вот оно какое красивое решение есть. POSIX говоришь. Сейчас в никсе проверю :D

UNIX задымывался как многозадачная среда. Когда один процесс пишет в пайп, а другой читает и обрабатывает информацию, то вся эта конструкция работает одновременно. На двухядерной машине время работы этих процессов вместе будет более чем в полтора раза меньше чем по отдельности.
Post #: 12
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> захват консольных месаг (С++)







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.