Взаимодействие с консольным приложением

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Взаимодействие с консольным приложением

Сообщение 0xy » 30.11.2011 (Ср) 2:14

Моя прога запускает (сторонний) консольный exe или bat. Как мне прочесть результат его работы? (пока приходится извращаться, перенаправляя вывод в файл (>FileName), но хотелось бы найти более ровный способ :) ).

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Взаимодействие с консольным приложением

Сообщение Хакер » 30.11.2011 (Ср) 6:30

Каждый консольный процесс при своём рождении получает от системы в своё распоряжении три хендла:
Один для stdin-а
Второя для stdout-а.
Третий для stderr-а.

Если процесс создаётся просто так, то процессу даются хендлы, унаследованные от процесса-создателя. Если консоль не наследуются, то передаётся новый набор стандартных хендлов.

Если процесс запускают через командную строку так:
process1 > file1
То система оболочка командной строки открывает файл «file1» и передаёт его хендл вместо stdout и stderr.

Если процессы запускаются так:
process1 | process2 | process3 <input >output
То оболочка командной строки запускает три процесса, открывает два файла, создаёт два пайпа и проставляет хендлы таким образом:
pipes.png


Таким образом, процессу можно подсунуть хендл чего угодно, что позволяет читать/писать в себя.

Тебе нужно при создании процесса твоего консольного приложения указать хендл W-конца созданного тобою пайпа, а из R-конца забирать данные. Примеров — тьма-тьмущая.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Взаимодействие с консольным приложением

Сообщение 0xy » 30.11.2011 (Ср) 19:35

Спасибо, всё понятно.

Вот, нашел хороший пример: http://www.codenet.ru/progr/bcb/pipes.php

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: Взаимодействие с консольным приложением

Сообщение alibek » 01.12.2011 (Чт) 9:01

Хакер писал(а):Если процесс запускают через командную строку так:
process1 > file1
То система оболочка командной строки открывает файл «file1» и передаёт его хендл вместо stdout и stderr.

> перенаправляет только stdout (поток 1).
Чтобы перенаправить поток 2 (stderr), нужно это указать отдельно:
process1 >result.txt 2>&1
process1 >result.stdout.txt 2>result.stderr.txt

Другими словами, по умолчанию:
< означает 0<
> означает 1>
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Взаимодействие с консольным приложением

Сообщение Хакер » 01.12.2011 (Чт) 12:10

Ага, признаю ошибку.

Меня ввела в заблуждение своя же утилита, которую я днём раньше тестировал. Они при использовании > бросала в файл и нормальные строки, и ошибочные. В последствии оказалось, что она принимает ошибочные строки за нормальные, но воспоминание закрепилось.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 26

    TopList