[WinXP/dos] Как лучше запрограммировать управление дос-приложением?

durka82

Какие средства есть под виндами для взаимодействия с дос-приложениями?
Насколько я понимаю, в первую очередь нужно взаимодействовать с cmd.exe.
Как это лучше сделать (есть ли у cmd сервер автоматизации, например?)?

bleyman

cmd.exe это не досовское, а консольное приложение. Для него не запускается ntvdm.
А что именно ты понимаешь под взаимодействием?

durka82

cmd.exe это не досовское, а консольное приложение
Но ведь под ХР досовские приложения запускаются именно под cmd. Или не обязательно?
что именно ты понимаешь под взаимодействием?
Передача клавиатурных команд и считывание выводимой на экран информации.
Но это не обычное консольное приложение - это оконное текстовое приложение - попытка перенаправления ввода и вывода с помощью < и > здесь не работает.

bleyman

А!
Предупреждал бы, что кросспостишь.
Есть разнообразные winApi функции для работы с консолью. Правда, есть определённые проблемы с вызовом их для стороннего приложения - нужно запускать его под дебагом или длл-инжекшен делать, насколько я помню.
Сделай вот что: залезь на офсайт FAR commander, тыкнись в плагины и найди там софтину, которая вообще-то не является плагином конкретно к фару, а позволяет запускать в одном консольном окошке несколько виртуальных консолей (и, соответственно, приложений чтобы потом переключаться между ними как в никсах. Названия не помню и самому искать влом.
Так вот, у этой софтины есть сурцы на С++, довольно хорошо написанные, не очень большие и крайне познавательные - там и длл-инжекшен, и перехват апи-вызовов, и то, что тебе нужно - программный доступ к консоли чужого приложения.

evgen5555

Есть ещё вариант с DosBox и Mem[$B800:XXXX]

durka82

Сорри, совсем забыл описать сразу подробно или дать ссылку
То есть если просто написать приложение, которое будет запускать это dos-овское exec-ом, то управлять этим досовским неполучится?
Спасибо, поищу, посмотрю

durka82

Mem[$B800:XXXX]

Это относится к DosBox-у? Или это независимо?
Опять же этот диапазон адресов - это вроде бы графическая память. Или в текстовом режиме тоже там хранится?

durka82

позволяет запускать в одном консольном окошке несколько виртуальных консолей

Ты про это ?
Multi-panel
Модуль позволяет открывать более чем две файловые панели.

Вот еще.
Если да, исходников для него я найти пока не смог

evgen5555

К досбоксу это относится

agaaaa

то, про что тебе написали - это conman

Dasar

dos-овское или консольное приложение при старте берет три файловых дескриптора: in, out, err.
соответственно:
in - это ввод, out - вывод, err- вывод ошибок.
по умолчанию, in - это клавиатура, out и err - экран.
все эти три файловые дескриптора можно переопределить, и напрямую работать с приложением.

durka82

А откуда берет и как переопределить?
На уровне консоли это можно сделать?

agaaaa

если просто переопределить вывод Far'а, он не будет работать

durka82

А разве Far - дос-приложение?
У меня не получилось перенаправлять ввод и вывод посредством <,>,<<,>>.

durka82

2
Что-то поиск conman-а на сайте Фара ничего не дал
Вообще удалось найти только версию под никс.
Мб у кого есть под вин?

agaaaa

посмотри тут

durka82

Спасибо, порылся там в ссылках и нашел

bleyman

dos-овское или консольное приложение при старте берет три файловых дескриптора: in, out, err.
соответственно:
in - это ввод, out - вывод, err- вывод ошибок.
по умолчанию, in - это клавиатура, out и err - экран.
все эти три файловые дескриптора можно переопределить, и напрямую работать с приложением.
А казалось бы взрослый, неглупый даже человек...

Dasar

> А откуда берет и как переопределить?
снаружи,
передать другие файловые дескрипторы (например, pipe-ы)
> На уровне консоли это можно сделать?
не понял, что значит "на уровне консоли".
ты задачу какую вообще хочешь решить?

Dasar

> Но это не обычное консольное приложение - это оконное текстовое приложение - попытка перенаправления ввода и вывода с помощью < и > здесь не работает
извини, не заметил, когда отвечал.
для псевдооконных dos/console-приложений, как правильно заметил _fj, необходимо будет делать dll-injection и перехватывать winapi-вызовы.

durka82

А можно поподробнее про этот вариант?
А то в документации к DosBox здесь написано лишь про то, что mem позволяет посмотреть объем памяти, но никак не содержимое

kruzer25

В файлах vc.com/nc.com - тоже WinAPI вызовы?
Кстати, под вендой постоянно сталкиваюсь с тем, что некоторые консольные приложения (из разряда всяких там ping, ipconfig, bcdedit - сейчас точно не помню, что именно не работает) без всякого псевдооконного интерфейса выводят текст напрямую в консоль (т.е., например, qwerty.exe/a /b |more всё равно выдаёт на экран всё сразу)

evgen5555

Память надо просматривать из своей программы, написанной на _любом_ языке, который только может компиляться под DOS.

durka82

Как-то это все неконкретно - нельзя ли какой пример?
Какая роль Досбокса в этом? Почему недостаточно в cmd запустить?

agaaaa

я думаю, что нужно что-то вроде упомянутого мной conman'а
самому, кстати, было бы интересно такое реализовать, ибо conman в моей 64-битной венде не работает как надо

shlyumper

без всякого псевдооконного интерфейса выводят текст напрямую в консоль (т.е., например, qwerty.exe/a /b |more всё равно выдаёт на экран всё сразу)

Открой для себя stderr.

kruzer25

Это были не ошибки, а стандартный вывод программы или её /?
Что-то у меня оень сильные сомнения, что программисты из МС, какими бы ужасными они не были, стали выдавать инфу, предназначенную пользователю, в stderr.

shlyumper

слать /? в stderr - стандартная достаточно практика.

kruzer25

Слать вывод "route print *" в stderr - тоже стандартная практика?

Ivan8209

У микрософта свои стандарты.
---
...Я работаю антинаучным аферистом...

Andbar

Слать вывод "route print *" в stderr - тоже стандартная практика?
гонишь, под 2к3 вывод перенаправляется так:
route print >out
а не так:
route print 2>out

kruzer25

Да мне плевать на все эти заумные рассуждения, я вижу, что route print * занимает больше одного экрана, запускаю route print * |more - и хуй.

Andbar

Ты наверное зря заплатил майкрософт

IPv4 таблица маршрута
===========================================================================
Список интерфейсов
0x1 ...........................
0x2 ...0 ......
0x10004 .........
0x110005 ... ......
0x1c0006 ... ......
===========================================================================
===========================================================================
Активные маршруты:
Сетевой адрес Маска сети Адрес шлюза Интерфейс Метрика
<cut>
-- More --
Оставить комментарий
Имя или ник:
Комментарий: