захват консольных месаг (С++)
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
захват консольных месаг (С++) - 2008-01-24 00:47:05.686666
|
|
|
weiss
Сообщений: 23
Оценки: 0
Присоединился: 2007-11-28 14:55:35.510000
|
привет народ! нужно написать графический фронтенд к консольной тузле, может кто-то подсказать как после ее запуска перехватить ее вывод, чтобы отобразить в графической оболочке? может не совсем ясно обьяснил но по другому не могу - пиво рулит;)
|
|
|
RE: захват консольных месаг (С++) - 2008-01-24 07:19:18.966666
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
pipe
|
|
|
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;
|
|
|
RE: захват консольных месаг (С++) - 2008-01-24 15:12:57.756666
|
|
|
weiss
Сообщений: 23
Оценки: 0
Присоединился: 2007-11-28 14:55:35.510000
|
хех, как раз пытаюсь слезть с дельфина и пересесть на VC++ :)В любом случае сенкс… надо msdn ставить короче8|
|
|
|
RE: захват консольных месаг (С++) - 2008-01-24 16:13:33.696666
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: blаcksun На делфи: (код не мой) … Это радует, что не твой. include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
FILE *child = popen ("ls", "r");
char buf[81]; /* буфер ограничен в размерах, но давайте поверим в то
* что все длина всех строк вывода будут <=80 ;) */
if (!child) {
perror ("popen");
exit (1);
}
while (!feof (child)) {
fgets (buf, 80, child);
printf ("Line readed:\n> %s", buf);
}
fclose (child);
return 0;
}
|
|
|
RE: захват консольных месаг (С++) - 2008-01-24 16:58:19.090000
|
|
|
Absurd
Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666
|
2rgo: Сомневаюсь, что на MSVC++ это будет работать. А blacksun привел пример из MSDN переделанный на Дельфи. Хотя, с другой стороны система была не указала.
|
|
|
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-шной библиотеки.
|
|
|
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 в данный момент под рукой нет.
|
|
|
RE: захват консольных месаг (С++) - 2008-01-27 12:29:42.493333
|
|
|
weiss
Сообщений: 23
Оценки: 0
Присоединился: 2007-11-28 14:55:35.510000
|
_popen() работает, спс за подсказку, но консоль не открывается, буду думать дальше :)
|
|
|
RE: захват консольных месаг (С++) - 2008-01-27 19:02:54.453333
|
|
|
rgo
Сообщений: 7170
Оценки: 281
Присоединился: 2004-09-25 05:14:25
|
quote:
ORIGINAL: weiss _popen() работает, спс за подсказку, но консоль не открывается, буду думать дальше :) а зачем тебе открытая консоль? Приложение будет писать в пайп вместо консоли, то есть консоль не нужна абсолютно.
|
|
|
RE: захват консольных месаг (С++) - 2008-01-29 05:28:57.066666
|
|
|
crbunny
Сообщений: 223
Оценки: 0
Присоединился: 2006-06-22 21:20:01
|
Хе-хе, я вот сразу подумал - файл нашару открыть и в него перенаправлять, а вот оно какое красивое решение есть. POSIX говоришь. Сейчас в никсе проверю :D
|
|
|
RE: захват консольных месаг (С++) - 2008-01-30 10:27:24.233333
|
|
|
Absurd
Сообщений: 335
Оценки: 0
Присоединился: 2007-08-24 13:14:11.566666
|
quote:
ORIGINAL: crbunny Хе-хе, я вот сразу подумал - файл нашару открыть и в него перенаправлять, а вот оно какое красивое решение есть. POSIX говоришь. Сейчас в никсе проверю :D UNIX задымывался как многозадачная среда. Когда один процесс пишет в пайп, а другой читает и обрабатывает информацию, то вся эта конструкция работает одновременно. На двухядерной машине время работы этих процессов вместе будет более чем в полтора раза меньше чем по отдельности.
|
|
|
|
|