Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.05.2017, 20:02   #1
COREYCO
Новичок
Джуниор
 
Регистрация: 08.05.2017
Сообщений: 16
По умолчанию Запуск консоли из GUI

Проблема следующая:

1. Имеется консоль C1.exe ( просто .exe-шник, без проекта )
Консоль не простая, правда... Может работать в 64-битной среде и
использовать до 16 ядер процессора ( у меня как раз Windows 8 pro )...

2. Имеется проект ( с исходниками в C++Builder XE3 ), который готовит
некое Windows-приложение W1.exe

Что, собственно, хотелось бы реализовать:

1. Запуск консоли C1.exe из W1.exe ( например, при нажатии кнопки )
В более древних bcb4, bcb5 использовалось CreateProcess(...)

2. Доступ к вводу/выводу консоли из W1.exe
Например, передать ( текст команды +/n ), подождать когда
появится текст ответа конслоли и передать его в W1.exe ( например,
в некий RichEdit1 )

3. Возможен вариант, когда консоль может часами непрерывно
выдавать текст... При этом "конец ответа" точно определить
сложно ( или он наступит через неделю, скажем )... Можно ли
в таком "экстремальном" случае все "свежие" символы из буфера
консоли синхронно ( т.е. более-менее одновременно ) добавлять
к текущему тексту RichEdit1 ??

Заранее благодарю, если кто-то внесёт ясность...


P.S.
В старых bcb была полная документация по Win32 API...
Сейчас у меня C++Builder XE3 и я не нахожу в Help ничего
похожего на Win64 API..
COREYCO вне форума Ответить с цитированием
Старый 08.05.2017, 20:29   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от COREYCO Посмотреть сообщение
ничего
похожего на Win64 API
https://msdn.microsoft.com/library
waleri вне форума Ответить с цитированием
Старый 09.05.2017, 10:58   #3
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 734
По умолчанию

Цитата:
Сообщение от COREYCO Посмотреть сообщение
В более древних bcb4, bcb5 использовалось CreateProcess(...)
- там не CreateProcess использовалось, а использовалось:
Код:
WinExec
ShellExecute
- и сейчас используется. Вот это, собственно говоря, я и хотел посоветовать. Только не знаю я как информационный обмен наладить между запущенным приложением и Вашей формой. Я вот что-то слышал про DDE. Может это поможет?
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 09.05.2017, 11:14   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

В смысле "использовалось"? Это API ОС.

WinExec deprecated уже давно.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.05.2017, 13:02   #5
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 734
По умолчанию

Ну запускать уже понятно чем. Для того, чтобы организовать обмен данными между приложениями нужно изучать SendMessage() и обмен сообщениями между приложениями, так называемые Windows-сообщения(WM_USER, например).
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 09.05.2017, 13:25   #6
Cuprum5
Форумчанин
 
Регистрация: 09.05.2017
Сообщений: 734
По умолчанию

Также нужно знать такие слова, как:
Код:
BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_MyMessage, TMessage, OnMyMessage);
END_MESSAGE_MAP(TComponent)
Это карта сообщений и она пишется в конце объявления класса TForm1 в публичной части. Я точно не помню, но по-моему так:
1) WM_MyMessage - код сообщения, просто цифра, в том коде, где я смотрел это просто переопределенный WM_USER:
Код:
#define WM_MyMessage WM_USER
WM_USER - сообщения пользователя, дальше свои сообщения создаются по-моему так:
Код:
WM_USER + 1
WM_USER + 2
и т.д.
Так ведь, да, профессионалы?
2) TMessage - класс сообщения;
3) OnMyMessage - функция-обработчик события, которое реагирует на это сообщение (WM_MyMessage). Вот 1-ая строка обработчика этого события:
Код:
void __fastcall TForm1::OnMyMess(TMessage& m)
m - это структра, которое содержит само сообщение и 3 переменные. Вот ее объявление из Helpa C++Builder 6:
Код:
struct TMessage
{
	Cardinal Msg;
	union
	{
		struct 
		{
			Word WParamLo;
			Word WParamHi;
			Word LParamLo;
			Word LParamHi;
			Word ResultLo;
			Word ResultHi;
			
		};
		struct 
		{
			int WParam;
			int LParam;
			int Result;
		};
		
	};
} ;
4) TComponent - не помню что такое, может быть кто-нибудь подскажет? Это компонент для которого пишутся события или что-то такое, короче не помню я уже.
Ну примерно вот так. Найдите себе какой-нибудь пример в Интернете и рализуйте его.
Напишу программу на C++ и Asm для AVR. Черчение: sergeisky@yahoo.com.
Cuprum5 вне форума Ответить с цитированием
Старый 09.05.2017, 13:54   #7
COREYCO
Новичок
Джуниор
 
Регистрация: 08.05.2017
Сообщений: 16
По умолчанию

...

Последний раз редактировалось COREYCO; 09.05.2017 в 14:59.
COREYCO вне форума Ответить с цитированием
Старый 09.05.2017, 13:58   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

А с чего вдруг оно должно было быть так воспринято?
Запуск это CreateProcess или ShellExecute.

Если вам нужен вывод запущенного процесса, то после CreateProcess можно перенаправить.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 09.05.2017 в 14:00.
Alex11223 вне форума Ответить с цитированием
Старый 09.05.2017, 14:02   #9
COREYCO
Новичок
Джуниор
 
Регистрация: 08.05.2017
Сообщений: 16
По умолчанию

Цитата:
Сообщение от Cuprum5 Посмотреть сообщение
Ну запускать уже понятно чем. Для того, чтобы организовать обмен данными между приложениями нужно изучать SendMessage() и обмен сообщениями между приложениями, так называемые Windows-сообщения(WM_USER, например).
Это для обмена между двумя Windows-приложениями ( особенно, если есть
оба исходника, где можно прописать "сценарий" )

А тут одно из приложений консоль ( .exe безо всяких исходников ), для которого
я не могу прописать сценарий взаимодействия с Windows-приложением ( здесь
с исходниками всё в порядке - можно редактировать, компилировать и т.д. )
COREYCO вне форума Ответить с цитированием
Старый 09.05.2017, 14:55   #10
COREYCO
Новичок
Джуниор
 
Регистрация: 08.05.2017
Сообщений: 16
По умолчанию

ShellExecute
(
Form1->Handle,
"open",
"d:\\...\\C1.exe",
NULL,
NULL,
SW_SHOWNORMAL
);

Вот это нормально запустило консоль C1.exe из формы Form1...
В окне консоли можно вручную вводить команды...
Если C1.exe их понимает, то что-то выдаёт в ответ...

Теперь осталось "научиться":
1. посылать команды из Form1 ( а не вручную )
2. дублировать ответы C1.exe в неком Memo1 или RichEdit1 ( Form1/ W1.exe )
+ анализировать их ( что уже немного уводит в сторону от темы )...
COREYCO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
запуск программы в консоли deniscatch Общие вопросы по Java, Java SE, Kotlin 2 04.08.2014 23:38
Запуск и чтение данных из консоли Random2 C++ Builder 0 26.02.2013 21:24
запуск сборки из консоли sergio11 C# (си шарп) 2 01.02.2013 13:39
Запуск приложения из консоли stpdqstns Visual C++ 4 04.11.2012 16:02
Запуск консоли и перенаправление вывода ros.pro Общие вопросы Delphi 1 02.01.2012 18:49