Работа с консолью.

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Работа с консолью.

Сообщение Mikle » 13.07.2012 (Пт) 22:16

Тут есть куча примеров работы с консолью, но это СОЗДАНИЕ своей консоли. А можно ли работать с той консолью, из которой запущена программа? Достоточно только на вывод. Например, я запустил командную строку, из неё запустил свою программу на VB6, мне нужно вывести сообщение в то окно, откуда программа запущена.

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

Re: Работа с консолью.

Сообщение Хакер » 13.07.2012 (Пт) 22:22

Конечно.
  1. С помощью найденного мною трюка указать subsystem=console. Этот пункт опционален, я почти уверен, что и без него всё будет работать, но без него, если программа была запущена не из консоли, а просто так — все функции будут работать с ошибками. С ним же не важно, были ли программа запущена уже из консоли или же была запущена сама по себе. Будет либо унаследована родительская консоль, либо создана новая.
  2. Получить хендлы консоли (stdin, stdout, stderr) функцией GetStdHandle.
  3. Писать/читать в/из консоли стандартными функциями ReadFile/WriteFile как в обычный файл.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Работа с консолью.

Сообщение Mikle » 14.07.2012 (Сб) 16:29

Хакер писал(а):Получить хендлы консоли (stdin, stdout, stderr) функцией GetStdHandle.

Код: Выделить всё
Public Declare Function GetStdHandle Lib "kernel32" (ByVal nStdHandle As Long) As Long

Не понятно, как получить "stdin, stdout, stderr", что это за величины? Среди типов и констант в API Viewer их нет.
Но, может быть, мы глубоко копаем? Мне всего-то нужно, чтобы программа по завершении вывела в консоль, из которой запущена, одну строку сообщения. Может есть какие-то коды возврата, как есть Command$ для доступа к входящим параметрам? Хотя, подозреваю, что Win32 программы, в отличие от DOS-программ, после запуска получают отдельный поток и теряют связь с консолью.

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: Работа с консолью.

Сообщение iGrok » 14.07.2012 (Сб) 18:28

Mikle писал(а):Не понятно, как получить "stdin, stdout, stderr", что это за величины? Среди типов и констант в API Viewer их нет.

Майкл, ну уж от тебя-то..
http://msdn.microsoft.com/en-us/library ... 83231.aspx
label:
cli
jmp label

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Работа с консолью.

Сообщение Mikle » 14.07.2012 (Сб) 19:02

Тупанул :)
Привык, что в API Viewer всё есть.

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

Re: Работа с консолью.

Сообщение Хакер » 14.07.2012 (Сб) 20:32

Mikle писал(а):Не понятно, как получить "stdin, stdout, stderr", что это за величины?

Хендлы. Причём коммуникационные хендлы. То есть существует семейство хендлов, отождествляющие объекты, в которые можно читать и писать. То есть файлы, пайпы, сокеты, порты, диски, ленточные стримеры и т.п.

Mikle писал(а):Может есть какие-то коды возврата, как есть Command$ для доступа к входящим параметрам?

Нет. Код возврата есть, но это числовой код, который возвращает WinMain. Нет ничего подобного в системе как возврат текстовый сообщений. Есть просто чтение/запись в объект, поддерживающий IO-операции.

GetStdHandle возвращает хендлы чего-то, во что можно писать и откуда можно писать. Ты даже не знаешь что это. Это будет консоль, если твою программу запустили просто так.
Это будет хендл файла, если твою программу запустили так:
your_program.exe > output.txt
Это бужет хендл пайпа, если твою программу запустили из командной строки так:
some_program.exe | your_program.exe | third_program.exe


Mikle писал(а):Хотя, подозреваю, что Win32 программы, в отличие от DOS-программ, после запуска получают отдельный поток и теряют связь с консолью.

Сравнение с досом совершенно неадекватное. Ужасно, что все сравнивают консольные Windows-приложения с DOS-программами на том основании, что DOS-программы получают при запуске такой же окно, как и консольные Windows-приложения.

Конечно каждый процесс (не важно, консольный он, или это Half-Life) имеет свой новый поток. И все консольные приложения, порождённые друг-от-друга без особых мер, имеют равный доступ консоли. Так что могут, например, одновременно работая, выводить в консоль кашу-малашу.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

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

Re: Работа с консолью.

Сообщение Хакер » 14.07.2012 (Сб) 20:32

Вообще ничего сложного, например пример за пару минут:
Вложения
console_for_mikle.zip
Консольная программа на VB. Запускать сразу, или батником (батник выводит кое-какие подсказки). Или запускать из cmd. Или любым мыслимым способом.
(4.48 Кб) Скачиваний: 76
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4148
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Re: Работа с консолью.

Сообщение Mikle » 15.07.2012 (Вс) 16:38

Благодарю, то, что нужно.

uni
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 105
Зарегистрирован: 05.05.2006 (Пт) 15:24
Откуда: Екатеринбург

Re: Работа с консолью.

Сообщение uni » 24.07.2012 (Вт) 2:39

Есть уже готовые модули для этого. Я использовал их в своей программе PipeCalc (консольная).
Вот ссылка на сообщение: - добавлены модули поддержки консоли от Karl E. Peterson: MEnvVars.bas, MConsole.bas;
Как использовать: Application.cls
Россия навсегда!
Сетрификаты

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

Re: Работа с консолью.

Сообщение Хакер » 24.07.2012 (Вт) 8:50

Стоит конечно иметь модуль на 2000 строк ради того, что решается десятью строчками.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 33

    TopList