Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-55654
CAHbI4
2003-07-04 13:49
2003.07.17
Поиск в TListView


1-55597
Ross
2003-07-03 13:51
2003.07.17
Создание и удаление файла


14-55737
Johnmen
2003-07-02 13:06
2003.07.17
Ясность ? Ясность... Ясность !


1-55602
kasper
2003-07-03 15:18
2003.07.17
как создать приложение по dll


14-55800
miek
2003-07-01 00:14
2003.07.17
Борландовский юмор





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский