Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Консоль и GUI 
V
    Опции темы
Afinogen
Дата 12.3.2013, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 23.12.2007

Репутация: нет
Всего: нет



Суть проблемы такая, при запуске из проводника виндовс должна открыться форма и пользователь работает с ней. А при запуске из cmd информация должна выводиться и в консоль и на форму (такое есть в линуксе). 
Пишу в eclipse+mingw, язык с++. В опциях линкера есть параметр -mwindows. С ним только форма, без него консоль и форма. Но консоль появляется постоянно и при запуске из cmd и просто.

PM MAIL   Вверх
bsa
Дата 12.3.2013, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 1
Всего: 196



при запуске неконсольных программ из консоли они от нее отцепляются.
PM   Вверх
Afinogen
Дата 12.3.2013, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 23.12.2007

Репутация: нет
Всего: нет



Печалька  smile

Это сообщение отредактировал(а) Afinogen - 12.3.2013, 23:02
PM MAIL   Вверх
leniviy
Дата 13.3.2013, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



Вообще-то такой механизм реализован в версии Netbeans для Windows, а также таким свойством обладает сборка Gedit под Windows.
Netbeans.exe -  это маленький ланчер джавы. Я думаю, разобраться в его исходниках будет не сложно.

Я думаю, 'subsytem' определяет лишь, будет ли cmd.exe в интерактивном режиме ждать завершения программы. А отцепление от консоли делает, возможно, сама программа.

Это сообщение отредактировал(а) leniviy - 13.3.2013, 11:21
PM MAIL   Вверх
bsa
Дата 13.3.2013, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 1
Всего: 196



В любом случае, вопрос не соответствует разделу. Следует задавать в WinAPI.
PM   Вверх
Afinogen
Дата 13.3.2013, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 23.12.2007

Репутация: нет
Всего: нет



Код

int WINAPI WinMain (HINSTANCE hThisInstance,HINSTANCE hPrevInstance,LPSTR lpszArgument,int nFunsterStil)
{
    MSG messages;            /* Here messages to the application are saved */

    InitForm(hThisInstance,nFunsterStil);             //создание формы

    system("cls");

    //cout<<Rus("Введите количество запросов на обмен:");
    //cin>>CountQuery;
    //CountQuery=30;

    //system("cls");

    //hTimer=SetTimer(NULL,0, 50, &TimerProc); //запуск таймера

    /* Run the message loop. It will run until GetMessage() returns 0 */
    while (GetMessage (&messages, NULL, 0, 0))
    {
        /* Translate virtual-key messages into character messages */
        TranslateMessage(&messages);
        /* Send message to WindowProcedure */
        DispatchMessage(&messages);
    }

    /* The program return-value is 0 - The value that PostQuitMessage() gave */
    return messages.wParam;
}

Пробовал разные опции -Wl,--subsystem,windows -mwindows
не помогло...

Вариант что программа сама отцепляется от консоли похож на правду, т.к. консольные приложения не отцепляются от cmd но куда копать пока  не пойму

bsa, я думал это опции линковщика, перенесите пожалуйста в нужный раздел.


Это сообщение отредактировал(а) Afinogen - 13.3.2013, 13:45
PM MAIL   Вверх
Afinogen
Дата 13.3.2013, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 23.12.2007

Репутация: нет
Всего: нет



Нашел решение, возможно не совсем красивое
Код

CONSOLE_SCREEN_BUFFER_INFO info; // Для получения текущей позиции курсора

HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); // Это ты знаешь, зачем
GetConsoleScreenBufferInfo(hCon, &info); // Получаем информацию о позиции курсора

if (info.dwCursorPosition.Y==0) FreeConsole();

Узнаем позицию курсора в консоли, для не консольных приложений это х=0 у=0, для консольных у будет больше 0  smile 
PM MAIL   Вверх
leniviy
Дата 13.3.2013, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 552
Регистрация: 8.2.2003
Где: Спб

Репутация: 1
Всего: 5



В Netbeans делают не консольное приложение и используют функцию "AttachConsole", затем fopen("CON").
http://hg.netbeans.org/main-golden/file/2d...sfuncs.cpp#l343

Это сообщение отредактировал(а) leniviy - 13.3.2013, 22:50
PM MAIL   Вверх
Afinogen
Дата 13.3.2013, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 23.12.2007

Репутация: нет
Всего: нет



leniviy, AttachConsole создает отдельное окно cmd для вызвавшей эту функцию программы, это тоже самое что и параметр линковщика -mwindows. Мне не нужно чтобы пользователь после дабл клика по ярлыку с программой видел окно с консолью, нужно чтобы данные выводились в консоль только при вызове программы из консоли.
P.S. может я чего не понял в исходнике NetBeans, время позднее...
PM MAIL   Вверх
GremlinProg
Дата 18.3.2013, 15:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Afinogen, как вариант - написать консольное приложение-switch'ер, которое бы смотрело на свою строку запуска и в случае, если к GUI требовался бы дополнительный консольный вывод - создавала бы пайп и передавало бы его каким-то образом в GUI, например: через командную строку для CreateProcess, а GUI уже подхватывал этот пайп и писал в него все что надо. В таком случае, switch'ер должен редиректить вывод из пайпа в свою консоль до тех пор, пока дочерний процесс не будет завершен.

Добавлено через 42 секунды
в таком случае, switch'ер - исходная точка запуска приложения

Добавлено через 4 минуты и 22 секунды
только при запуске из проводника придется запускать GUI-приложение напрямую (минуя switch'ер), чтобы не появлялась консоль


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GremlinProg
Дата 18.3.2013, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



По сути, сам факт задействования switch'еа - альтернатива Вашего флага, т.е. можно ни каких проверок switch'у и не делать, достаточно в GUI проверить наличие пайпа в своей командной строке.


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Dem_max
Дата 18.3.2013, 17:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1780
Регистрация: 12.4.2007

Репутация: 16
Всего: 39



все легко и просто:
1. При запуске твоего процесса определить, кто вызвал CreateProcess который запустил программу.
2. Если это cmd, создать окно Windows и привязать ввод и вывод к cmd породивший твой процесс.
3. Если твою программу породил не cmd, просто создать окно Windows.


--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
xvr
Дата 19.3.2013, 11:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Если вы хотите, что бы при запуске вашего приложения из консоли оно начало выводит данные в эту же консоль, то вы обязанны сделать свое приложение консольным. В противном случае вы не сможете получить доступ к консоли родительского процесса.

При запуске консольного приложения из под Проводника всегда будет появляться новая консоль, но ее можно оперативно убить из самого приложения позвав FreeConsole()

IMHO сделать по другому не получится, т.к. таков способ обработки консоли в самой Windows

PM MAIL   Вверх
GremlinProg
Дата 19.3.2013, 13:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



Цитата(xvr @  19.3.2013,  13:51 Найти цитируемый пост)
IMHO сделать по другому не получится, т.к. таков способ обработки консоли в самой Windows

по другому я предложил, через дополнительное консольное приложение


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
xvr
Дата 19.3.2013, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 40
Всего: 223



Цитата(GremlinProg @  19.3.2013,  13:13 Найти цитируемый пост)
по другому я предложил, через дополнительное консольное приложение 

При этом будет кратковременно выскакивать консоль при старте из проводника. Вариант с -

Цитата(GremlinProg @  18.3.2013,  15:37 Найти цитируемый пост)
только при запуске из проводника придется запускать GUI-приложение напрямую (минуя switch'ер), чтобы не появлялась консоль

требует от пользователя знать где и какое именно приложение нужно запускать. Возможно ТС это устроит, а может и нет  smile 

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.1530 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.