Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.07.17;
Скачать: CL | DM;

Вниз

Помогите разобраться с 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.021 c
3-55465
Alex_x
2003-06-25 11:25
2003.07.17
Немогу установить фильтр на датасет


3-55450
Valeriya
2003-06-24 08:37
2003.07.17
как сделать специфические столбцы в QReport е


11-55482
mike.dld
2002-11-09 15:42
2003.07.17
StringGrid


14-55769
k-man
2003-06-30 12:42
2003.07.17
А в Гадюкино опять дожди


1-55543
[BAD]Angel
2003-07-05 14:06
2003.07.17
Кнопка ПРИМЕНИТЬ