Форум: "Основная";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];
ВнизПомогите разобраться с pipes Найти похожие ветки
← →
jel (2003-07-04 10:56) [0]Пытаюсь поймать вывод консольного приложения. Использую anonymous pipes. Пишу код
var ReadHandle, WriteHandle, Readed : cardinal;
stin : STARTUPINFO;
prin : PROCESS_INFORMATION;
bufer : AnsiString;
begin
if CreatePipe(ReadHandle, WriteHandle, nil, 0) then begin
ZeroMemory(@stin, SizeOf(stin));
stin.cb := SizeOf(stin);
stin.hStdOutput := WriteHandle;
stin.hStdError := GetStdHandle(STD_ERROR_HANDLE);
stin.hStdInput := GetStdHandle(STD_INPUT_HANDLE);
stin.dwFlags := STARTF_USESTDHANDLES;
if CreateProcess("c:\aaa.com", nil, nil, nil, true, 0, nil, nil,stin,prin) then begin
SetLength(bufer, 64*1024);
if ReadFile(ReadHandle, bufer, 100, readed, nil) then begin
Memo1.Text := bufer;
ShowMessage("Прочитано " + IntToStr(readed))
end else ShowMessage(SysErrorMessage(GetLastError));
end else ShowMessage("Can""t create process");
CloseHandle(ReadHandle);
CloseHandle(WriteHandle);
end else ShowMessage("Can""t create pipe");
end;
Виснет наглухо при вызове ReadFile. И не могу понять что указывать в третьем параметре ReadFile. Количество байт ведь заранее неизвестно? Ткните носом, плиз, где затупил?
← →
MBo (2003-07-04 11:05) [1]ReadFile(...bufer[1]...
← →
jel (2003-07-04 11:08) [2]MBo © (04.07.03 11:05)
Спасибо - не заметил, но проблему это не решает. Виснет наглухо. И что передавать третьим параметром?
← →
MBo (2003-07-04 11:17) [3]ожидаемое количество байт.
Можно в цикле, пока readed не станет меньше запрошенного количества. Посмотри пример в msdn на anonymous pipe
← →
jel (2003-07-04 11:24) [4]
> MBo © (04.07.03 11:17)
Проблема в том, что не висит только когда передаешь 0. Но и не читает ничего соответственно. Консольная программулька вываливает на StdOut проядка 500 байт, но ни один не принять. Может быть Pipe создан неверно. Или при создании процесса чего-нибудь намудрил?
← →
MBo (2003-07-04 11:39) [5]в CreatePipe SECURITY_ATTRIBUTES передай с
bInheritHandle := True;
← →
jel (2003-07-04 11:50) [6]Нашел на MSDN пример, правда на VB - http://support.microsoft.com/default.aspx?scid=kb%3ben-us%3b173085
Привел свой код в соответствие:
var ReadHandle, WriteHandle, Readed : cardinal;
stin : STARTUPINFO;
prin : PROCESS_INFORMATION;
bufer : AnsiString;
sa : SECURITY_ATTRIBUTES;
begin
ZeroMemory(@sa, sizeOf(sa));
sa.nLength := SizeOf(sa);
sa.lpSecurityDescriptor := nil;
sa.bInheritHandle := true;
if CreatePipe(ReadHandle, WriteHandle, @sa, 0) then begin
ZeroMemory(@stin, SizeOf(stin));
stin.cb := SizeOf(stin);
stin.hStdOutput := WriteHandle;
stin.hStdError := GetStdHandle(STD_ERROR_HANDLE);
stin.hStdInput := GetStdHandle(STD_INPUT_HANDLE);
stin.dwFlags := STARTF_USESTDHANDLES;
if CreateProcess("c:\aaa.com", nil, @sa, @sa, true, NORMAL_PRIORITY_CLASS, nil, nil,stin,prin) then begin
SetLength(bufer, 64*1024);
if ReadFile(ReadHandle, bufer[1], 100, readed, nil) then begin
Memo1.Text := bufer;
ShowMessage("Прочитано " + IntToStr(readed))
end else ShowMessage(SysErrorMessage(GetLastError));
end else ShowMessage("Can""t create process");
CloseHandle(ReadHandle);
CloseHandle(WriteHandle);
CloseHandle(prin.hProcess);
CloseHandle(prin.hThread);
end else ShowMessage("Can""t create pipe");
end;
Результаты прежние. Может быть сие работает только под NT?
Может кто-нибудь этот код под NT прогнать и/или указать на причины его неработоспособности?
← →
MBo (2003-07-04 12:00) [7]с ping сработало, с другой программой - нет
← →
jel (2003-07-04 12:05) [8]
> MBo © (04.07.03 12:00)
> с ping сработало, с другой программой - нет
Проверил с другими программаим - такая же беда - в программе вывод которой ловлю он организован через INT 21H AH=9 (программа на ассемблере) - виснет, а вот вывод скомпилированной TP7 программы ловится на ура.
Нет ли иного, более универсального способоа отлова вывода консольных программ?
← →
MBo (2003-07-04 12:24) [9]Нет.
Когда-то использовал doscommand c www.master-brain.boom.ru
вывод ARj не перехватывался.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.07.17;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c