| 
			| 
					
						| 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 Кб - загружено 1077 раз.)
									 |  
								|  |  Записан | 
 |  |  | 
	| 
			| 
					
						| 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 |  
						| 
								|  |  
								|  |  Записан | 
 |  |  | 
	|  |