Главная страница
    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
3-55435
OlegID
2003-06-24 12:55
2003.07.17
история значений


1-55595
Sheng
2003-07-03 13:34
2003.07.17
Вызов почтовоко клиента


14-55809
Думкин
2003-06-30 06:43
2003.07.17
Окраины империи.


1-55503
panov
2003-07-04 15:38
2003.07.17
Object types или class?


1-55552
DrDrew
2003-07-05 17:41
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский