FanatWin
|
|
« : 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
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #1 : 29-08-2009 15:13 » |
|
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
zubr
Гость
|
|
« Ответ #2 : 29-08-2009 18:07 » |
|
К ссылке Fincha добавлю что это прокатит для консольного Windows-приложения. Если Dos-приложение, то никак.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #3 : 29-08-2009 18:18 » |
|
Ну в принципе можно поток вывода перенаправить например в файл. А потом с этого файла читать. Что то типа этого dir >demo, а потом читать файл demo. Хотя это изврашение, должен быть более легкий путь.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
zubr
Гость
|
|
« Ответ #4 : 29-08-2009 18:21 » |
|
Finch, для этого надо, чтобы само DOS-приложение свой вывод в файл гнало. А если DOS-приложение не свое?
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #5 : 29-08-2009 18:28 » |
|
zubr, >demo и есть та команда, которая заставляет весь вывод на консоль перегонять в файл demo. Можеш в консоле сам проверить. Но для этого нужно, чтоб консольное приложение использовала потоки вывода, а не прямой вывод в видеобуффер например.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
zubr
Гость
|
|
« Ответ #6 : 29-08-2009 18:46 » |
|
Finch,ой что й то я сумневваюсь... Неохота экспериментировать. Навскидку, при запуске DOS-приложения с выводом в файл, только создается файл, но он пустой.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #7 : 29-08-2009 19:13 » |
|
ОК Набери в консоле MS DOS команды. c: cd c:\ dir >demo copy demo con
Ты увидиш, что файл demo не пустой и следуюшая команда dir покажет его с не нулевой длиной.
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Kivals
|
|
« Ответ #8 : 29-08-2009 20:12 » |
|
zubr, Finch прав. Какие-то должны быть стандарты чтения потока вывода, потому как кроме перенаправления в файл ">" есть еще и перенаправление в стандартный поток ввода "|": выведет (в данном случае на экран) результат комманды dir, но только те текстовые строки, в которых найдется строка ".bat"
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #9 : 29-08-2009 20:15 » |
|
Ага - недосмотрел. Похоже в ссылке Finch как раз "про это" - как получить такой поток с помощью WinAPI
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #10 : 30-08-2009 05:32 » |
|
Finch, эти DOS-команды выполняются в консольном приложении винды, здесь все работает. Я же говорю о DOS-приложении, собранном к примеру в Turbo Pascal или Turbo C. Давайте не забывать, что DOS-приложения работают в реальном режиме, а винда в защищенном, поэтому насколько я помню, винда под дос-приложения вызывает виртуальную машину. Может и есть какой нибудь способ получить ввод-вывод с досовского приложения, но никак ни вышеприведенная ссылка, проверено экспериментально.
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #11 : 30-08-2009 07:35 » |
|
zubr, программы, созданные в чем угодно и использующие стандартные потоки ввода/вывода будут точно так же работать с переадресацией потоков. Если dir это комманда, то например find и sort - это программы (см. %SystemRoot%\System32\), а они точно также работают с перенаправлением
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #12 : 30-08-2009 12:18 » |
|
Kivals, вот пример простенькой паскальной программы со стандартным вводом-выводом. Возьми и выведи его в >demo. Аналогично, если не лень можешь поэкспериментировать с вводом-выводом, используя указанную Finch ссылкой. З.Ы. Программка собрана в Turbo Pascal.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
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
Гость
|
|
« Ответ #14 : 30-08-2009 13:34 » |
|
Finch, какая связь между борландом и языком программирования Паскаль в данном случае? Насколько я знаю стандартные функции ввода-вывода в языке Паскаль - Read, Write (в описаниях к данным функциям ничего специфического не помню), аналогичные им в C - SCANF, PRINTF. Потоки cin, cout - это уже C++.
|
|
|
Записан
|
|
|
|
Finch
Спокойный
Администратор
Offline
Пол:
Пролетал мимо
|
|
« Ответ #15 : 30-08-2009 13:50 » |
|
scanf и printf как раз с потока читают и пишут в него. Упрошенная форма от int fscanf (FILE *stream, const char *template, ...) и int fprintf (FILE *stream, const char *template, ...)
|
|
|
Записан
|
Не будите спашяго дракона. Джаффар (Коша)
|
|
|
Kivals
|
|
« Ответ #16 : 30-08-2009 14:35 » |
|
zubr, поток ввода/вывода - это понятие операционной системы, с которыми по идее должен парвильно уметь работать компилятор (термины, используемые в с++, лишь дублируют понятие потоков ОС). На Turbo Pascal я программировал в школе, когда о потоках ничего не знал - сказать не могу. В институте практика по паскалю была hp-unix - и там программы прекрасно работали с перенаправлением потоков (стандартный код, который должен компилироваться и в Turbo Pascal). Так вот - Read/Write - это высокоуровневые функции языка программирования, которые должны быть правильно (ИМХО) реализованы через потоки в компиляторе.
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #17 : 30-08-2009 14:37 » |
|
Вдогонку: консольные приложения в Delphi прекрасно работают с потоками как минимум с версии 3
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #18 : 30-08-2009 15:03 » |
|
zubr, поток ввода/вывода - это понятие операционной системы, с которыми по идее должен парвильно уметь работать компилятор (термины, используемые в с++, лишь дублируют понятие потоков ОС). На Turbo Pascal я программировал в школе, когда о потоках ничего не знал - сказать не могу. В институте практика по паскалю была hp-unix - и там программы прекрасно работали с перенаправлением потоков (стандартный код, который должен компилироваться и в Turbo Pascal). Так вот - Read/Write - это высокоуровневые функции языка программирования, которые должны быть правильно (ИМХО) реализованы через потоки в компиляторе.
Ты проверил как работает мой тест?
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #19 : 30-08-2009 15:15 » |
|
В общем я этим вопросом несколько лет назад занимался. Так вот с консольными приложениями StdInput, StdOutput прекрассно работало, а вот с DOS-приложениями (не моими, поэтому не знаю чем они были скомпилированы) не работало.
|
|
|
Записан
|
|
|
|
FanatWin
|
|
« Ответ #20 : 30-08-2009 21:09 » |
|
Вообще дела обстоят так… Есть программа работает из-под ДОС, по конвертации файла… гм… там во время конвертации идет процесс в процентах преобразования конвертируемого файла… Вот мне надо этот процесс (числовой) преобразования файла из программы Дос переправить в GUI на процесс-бар…
Я думаю, первая ссылка для этого подойдет… еще не совсем разобрался, что там к чему… но думаю, то что надо…
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #21 : 31-08-2009 07:31 » |
|
zubr, посмотрел. Вывод как я и писал - кривая работа компилятора (у меня при запуске твоего Test.exe даже режим экрана меняется, чего не должно быть в таком коде). Если мне память не изменяет - это возможно из-за подключения crt - он вроде перегружает стандартные ReadLn/WriteLn, но могу и ошибаться. В атаче простой проект консольного приложения, скомпиленый в Delphi 5 & FreePascal, использующий только ReadLn и WriteLn (без ReadKey) - все работает прекрасно с перенаправлениями.
|
Test.rar (55.18 Кб - загружено 990 раз.)
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #22 : 31-08-2009 07:48 » |
|
Kivals, еще раз повторяю, Delphi5 создает просто консольное 32-битное Windows-приложение. Я же компилировал в Turbo Pascal, а это 16-битное приложение под DOS. Причем здесь кривая работа компилятора, что компилятор у меня кривой, или код неправильный? Возьми и посмотри на заголовки исполняемых файлов. В твоем файле созданном в FreePascal есть надпись: This program cannot be run in DOS mode. Вот когда ты мне действительно досовскую программу покажешь с выводом в файл, тогда я признаю твою правоту.
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #23 : 31-08-2009 08:08 » |
|
Причем здесь кривая работа компилятора... При том, что в твоем коде нигде не указано изменять режим экрана в 80х43, а компилятор это делает за тебя - это уже неверно. Вот когда ты мне действительно досовскую программу покажешь... Вот это я как раз ищу сейчас во FreePascal...
|
|
|
Записан
|
|
|
|
zubr
Гость
|
|
« Ответ #24 : 31-08-2009 08:14 » |
|
Kivals, извиняюсь и признаю свою неправоту. Собрал твой код в Turbo Pascal - работает перенаправление в файлы. Выходит действительно дело в ReadKey. Интересно, а с сишными putch, getch есть такие проблемы?
|
|
|
Записан
|
|
|
|
Sla
|
|
« Ответ #25 : 31-08-2009 08:18 » |
|
погодьте если в турбопаскале не использовать crt модуль то test.exe >file работает нормально (в досе) могу ошибаться, но была такая необходимость и приходилось так делать crt модуль напрямую пишет в видеоозу
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
Sla
|
|
« Ответ #26 : 31-08-2009 08:21 » |
|
zubr, так readkey из crt модуля при инициализации модуля происходит перенаправление вызова как write так и read. Не помню уже как, но тогда я изучал исходники модулей.
|
|
|
Записан
|
Мы все учились понемногу... Чему-нибудь и как-нибудь.
|
|
|
zubr
Гость
|
|
« Ответ #27 : 31-08-2009 08:26 » |
|
Sla, я знаю что из CRT. Большинство паскальных досовских программ писалось с применением CRT. Кстати, сравнительно недавно пытался получить вывод с консольного компилятора Flex - в результате, когда компилляция успешная выводит без проблем, если компилляция с ошибками то ошибки выводимые в консоли в поток вывода не выводит. Отсюда вывод, многое зависит от реализации DOS-программы, потоки ввода-вывода которой надо перехватывать.
|
|
|
Записан
|
|
|
|
Kivals
|
|
« Ответ #28 : 31-08-2009 08:51 » |
|
zubr, Взаимно признаю свою неправоту про режим экрана - похоже винда переводит к этому режиму все реальные DOS приложения, т.к. утилиты FPC точно так же запускаются. Что касается перенаправления ошибок - то просто есть еще стандартный поток ошибок (cerr по-моему в с++). Вот здесь кратенько и по теме: http://citforum.amursu.ru/operating_systems/ois/c050.shtml. Перенаправлять с него в файл нужно такой коммандой: а чтобы вывод и ошибки перенаправить в один и тот же файл нужно использовать конструкцию program.exe > file.txt 2>&1
|
|
|
Записан
|
|
|
|
|