Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Из DOS… в GUI  (Прочитано 12183 раз)
0 Пользователей и 1 Гость смотрят эту тему.
FanatWin
Участник

ru
Offline Offline

WWW
« : 29-08-2009 14:48 » 

Добрый день...
Подскажите, как можно взять информацию из программы DOS и передать его в GUI. Или скажите вообще такое возможно…
Например, есть программа «Hello, world !!!», как её запустить, я знаю, вот как переправить эту надпись («Hello, world !!!»), к примеру, в Label, не знаю…
Запускаю так:

Код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
 String sPath = ExtractFilePath(ParamStr(0));
 sPath = sPath + "Hello.exe";
 STARTUPINFO StartInfo={sizeof(TStartupInfo)};
 PROCESS_INFORMATION ProcInfo;
 LPCTSTR s;
 StartInfo.cb = sizeof(StartInfo);
 StartInfo.dwFlags = STARTF_USESHOWWINDOW;
 StartInfo.wShowWindow = SW_SHOWNORMAL;
 if(!CreateProcess(NULL,sPath.c_str(),NULL,NULL,false,DETACHED_PROCESS | HIGH_PRIORITY_CLASS,NULL,NULL,&StartInfo, &ProcInfo)){
 ShowMessage("Ошибка №" + IntToStr(GetLastError()));
 }
}

Пишу на C++Builder 6
« Последнее редактирование: 06-09-2009 16:17 от Sel » Записан

Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 29-08-2009 15:13 » 

http://msdn.microsoft.com/en-us/library/ms682499%28VS.85%29.aspx
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #2 : 29-08-2009 18:07 » 

К ссылке Fincha добавлю что это прокатит для консольного Windows-приложения.
Если Dos-приложение, то никак.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #3 : 29-08-2009 18:18 » 

Ну в принципе можно поток вывода перенаправить например в файл. А потом с этого файла читать.
Что то типа этого dir >demo, а потом читать файл demo. Хотя это изврашение, должен быть более легкий путь.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #4 : 29-08-2009 18:21 » 

Finch, для этого надо, чтобы само DOS-приложение свой вывод в файл гнало. А если DOS-приложение не свое?
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #5 : 29-08-2009 18:28 » 

zubr, >demo и есть та команда, которая заставляет весь вывод на консоль перегонять в файл demo. Можеш в консоле сам проверить. Но для этого нужно, чтоб консольное приложение использовала потоки вывода, а не прямой вывод в видеобуффер например.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #6 : 29-08-2009 18:46 » 

Finch,ой что й то я  сумневваюсь... Неохота экспериментировать. Навскидку, при запуске DOS-приложения с выводом в файл, только создается файл, но он пустой.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #7 : 29-08-2009 19:13 » 

ОК Набери в консоле MS DOS команды.
Код:
c:
cd c:\
dir >demo
copy demo con
Ты увидиш, что файл demo не пустой и следуюшая команда dir покажет его с не нулевой длиной.
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Kivals
Команда клуба

us
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 29-08-2009 20:12 » 

zubr, Finch прав.
Какие-то должны быть стандарты чтения потока вывода, потому как кроме перенаправления в файл ">" есть еще и перенаправление в стандартный поток ввода "|":
Код:
dir | find ".bat"
выведет (в данном случае на экран) результат комманды dir, но только те текстовые строки, в которых найдется строка ".bat"
Записан
Kivals
Команда клуба

us
Offline Offline
Пол: Мужской

WWW
« Ответ #9 : 29-08-2009 20:15 » 

Ага - недосмотрел. Похоже в ссылке Finch как раз "про это" - как получить такой поток с помощью WinAPI
Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #10 : 30-08-2009 05:32 » 

Finch, эти DOS-команды выполняются в консольном приложении винды, здесь все работает. Я же говорю о DOS-приложении, собранном к примеру в Turbo Pascal или Turbo C. Давайте не забывать, что DOS-приложения работают в реальном режиме, а винда в защищенном, поэтому насколько я помню, винда под дос-приложения вызывает виртуальную машину. Может и есть какой нибудь способ получить ввод-вывод с досовского приложения, но никак ни вышеприведенная ссылка, проверено экспериментально.
Записан
Kivals
Команда клуба

us
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 30-08-2009 07:35 » 

zubr, программы, созданные в чем угодно и использующие стандартные потоки ввода/вывода будут точно так же работать с переадресацией потоков.
Если dir это комманда, то например find и sort - это программы (см. %SystemRoot%\System32\), а они точно также работают с перенаправлением
Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #12 : 30-08-2009 12:18 » 

Kivals, вот пример простенькой паскальной программы со стандартным вводом-выводом. Возьми и выведи его в >demo. Аналогично, если не лень можешь поэкспериментировать с вводом-выводом, используя указанную Finch ссылкой.
З.Ы. Программка собрана в Turbo Pascal.

* Test1.rar (3.24 Кб - загружено 164 раз.)
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #13 : 30-08-2009 12:45 » 

zubr, С паскалем особая история. Там не применяется понятие потока ввода-вывода. В Borland как-то по своему выводили на консоль, минуя функции BIOS.  А вот мой пример работал в MS-DOS это я точно помню Улыбаюсь. Насчет конвееров, что показал Kivals, я не уверен. В MS-DOS их не было. Но перенаправление вывода на устройство или файл точно было.

Кстати у Norton Commander примочки с архиваторами работали через перенаправление потока. Сам NC не архивировал.
« Последнее редактирование: 30-08-2009 12:50 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #14 : 30-08-2009 13:34 » 

Finch, какая связь между борландом и языком программирования Паскаль в данном случае? Насколько я знаю стандартные функции ввода-вывода в языке Паскаль - Read, Write (в описаниях к данным функциям ничего специфического не помню), аналогичные им в C - SCANF, PRINTF. Потоки cin, cout - это уже C++.
Записан
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #15 : 30-08-2009 13:50 » 

scanf и printf как раз с потока читают  и пишут в него. Упрошенная форма от int fscanf (FILE *stream, const char *template, ...) и int fprintf (FILE *stream, const char *template, ...)
Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Kivals
Команда клуба

us
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 30-08-2009 14:35 » 

zubr, поток ввода/вывода - это понятие операционной системы, с которыми по идее должен парвильно уметь работать компилятор (термины, используемые в с++, лишь дублируют понятие потоков ОС). На Turbo Pascal я программировал в школе, когда о потоках ничего не знал - сказать не могу. В институте практика по паскалю была hp-unix - и там программы прекрасно работали с перенаправлением потоков (стандартный код, который должен компилироваться и в Turbo Pascal). Так вот - Read/Write - это высокоуровневые функции языка программирования, которые должны быть правильно (ИМХО) реализованы через потоки в компиляторе.
Записан
Kivals
Команда клуба

us
Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 30-08-2009 14:37 » 

Вдогонку: консольные приложения в Delphi прекрасно работают с потоками как минимум с версии 3
Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #18 : 30-08-2009 15:03 » 

zubr, поток ввода/вывода - это понятие операционной системы, с которыми по идее должен парвильно уметь работать компилятор (термины, используемые в с++, лишь дублируют понятие потоков ОС). На Turbo Pascal я программировал в школе, когда о потоках ничего не знал - сказать не могу. В институте практика по паскалю была hp-unix - и там программы прекрасно работали с перенаправлением потоков (стандартный код, который должен компилироваться и в Turbo Pascal). Так вот - Read/Write - это высокоуровневые функции языка программирования, которые должны быть правильно (ИМХО) реализованы через потоки в компиляторе.
Ты проверил как работает мой тест?
Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #19 : 30-08-2009 15:15 » 

В общем я этим вопросом несколько лет назад занимался. Так вот с консольными приложениями StdInput, StdOutput прекрассно работало, а вот с DOS-приложениями (не моими, поэтому не знаю чем они были скомпилированы) не работало.
Записан
FanatWin
Участник

ru
Offline Offline

WWW
« Ответ #20 : 30-08-2009 21:09 » 

Вообще дела обстоят так…
Есть программа работает из-под ДОС, по конвертации файла… гм… там во время конвертации идет процесс в процентах преобразования конвертируемого файла…
Вот мне надо этот процесс (числовой) преобразования файла из программы Дос переправить в GUI на процесс-бар…

Я думаю, первая ссылка для этого подойдет… еще не совсем разобрался, что там к чему… но думаю, то что надо…
Записан

Kivals
Команда клуба

us
Offline Offline
Пол: Мужской

WWW
« Ответ #21 : 31-08-2009 07:31 » 

zubr, посмотрел. Вывод как я и писал - кривая работа компилятора (у меня при запуске твоего Test.exe даже режим экрана меняется, чего не должно быть в таком коде). Если мне память не изменяет - это возможно из-за подключения crt - он вроде перегружает стандартные ReadLn/WriteLn, но могу и ошибаться.
В атаче простой проект консольного приложения, скомпиленый в Delphi 5 & FreePascal, использующий только ReadLn и WriteLn (без ReadKey) - все работает прекрасно с перенаправлениями.

* Test.rar (55.18 Кб - загружено 170 раз.)
Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #22 : 31-08-2009 07:48 » 

Kivals, еще раз повторяю, Delphi5 создает просто консольное 32-битное Windows-приложение. Я же компилировал в Turbo Pascal, а это 16-битное приложение под DOS. Причем здесь кривая работа компилятора, что компилятор у меня кривой, или код неправильный? Возьми и посмотри на заголовки исполняемых файлов. В твоем файле  созданном в FreePascal есть надпись: This program cannot be run in DOS mode. Вот когда ты мне действительно досовскую программу покажешь с выводом в файл, тогда я признаю твою правоту.
Записан
Kivals
Команда клуба

us
Offline Offline
Пол: Мужской

WWW
« Ответ #23 : 31-08-2009 08:08 » 

Цитата
Причем здесь кривая работа компилятора...
При том, что в твоем коде нигде не указано изменять режим экрана в 80х43, а компилятор это делает за тебя - это уже неверно.
Цитата
Вот когда ты мне действительно досовскую программу покажешь...
Вот это я как раз ищу сейчас во FreePascal... Улыбаюсь
Записан
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #24 : 31-08-2009 08:14 » 

Kivals, извиняюсь и признаю свою неправоту. Собрал твой код в Turbo Pascal - работает перенаправление в файлы. Выходит действительно дело в ReadKey. Интересно, а с сишными putch, getch есть такие проблемы?
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #25 : 31-08-2009 08:18 » 

погодьте
если в турбопаскале не использовать crt модуль
то test.exe >file  работает нормально (в досе)
могу ошибаться, но была такая необходимость и приходилось так делать
crt модуль напрямую пишет в видеоозу
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #26 : 31-08-2009 08:21 » 

zubr, так readkey из crt модуля
при инициализации модуля происходит перенаправление вызова как write так и read.
Не помню уже как, но тогда я изучал исходники модулей.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
zubr
Команда клуба

by
Offline Offline
Пол: Мужской

« Ответ #27 : 31-08-2009 08:26 » 

Sla, я знаю что из CRT. Большинство паскальных досовских программ писалось с применением CRT.
Кстати, сравнительно недавно пытался получить вывод с консольного компилятора Flex - в результате, когда компилляция успешная выводит без проблем, если компилляция с ошибками то ошибки выводимые в консоли в поток вывода не выводит. Отсюда вывод, многое зависит от реализации DOS-программы, потоки ввода-вывода которой надо перехватывать.
Записан
Kivals
Команда клуба

us
Offline Offline
Пол: Мужской

WWW
« Ответ #28 : 31-08-2009 08:51 » 

zubr, Взаимно признаю свою неправоту про режим экрана - похоже винда переводит к этому режиму все реальные DOS приложения, т.к. утилиты FPC точно так же запускаются.

Что касается перенаправления ошибок - то просто есть еще стандартный поток ошибок (cerr по-моему в с++). Вот здесь кратенько и по теме: http://citforum.amursu.ru/operating_systems/ois/c050.shtml. Перенаправлять с него в файл нужно такой коммандой:
Код:
program.exe 2> file.txt

а чтобы вывод и ошибки перенаправить в один и тот же файл нужно использовать конструкцию
Код:
program.exe > file.txt 2>&1
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines