Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > C/C++: Системное программирование и WinAPI > Консоль и GUI |
Автор: Afinogen 12.3.2013, 20:20 |
Суть проблемы такая, при запуске из проводника виндовс должна открыться форма и пользователь работает с ней. А при запуске из cmd информация должна выводиться и в консоль и на форму (такое есть в линуксе). Пишу в eclipse+mingw, язык с++. В опциях линкера есть параметр -mwindows. С ним только форма, без него консоль и форма. Но консоль появляется постоянно и при запуске из cmd и просто. |
Автор: bsa 12.3.2013, 22:08 |
при запуске неконсольных программ из консоли они от нее отцепляются. |
Автор: Afinogen 12.3.2013, 23:01 |
Печалька ![]() |
Автор: leniviy 13.3.2013, 11:18 |
Вообще-то такой механизм реализован в версии Netbeans для Windows, а также таким свойством обладает сборка Gedit под Windows. Netbeans.exe - это маленький ланчер джавы. Я думаю, разобраться в его исходниках будет не сложно. Я думаю, 'subsytem' определяет лишь, будет ли cmd.exe в интерактивном режиме ждать завершения программы. А отцепление от консоли делает, возможно, сама программа. |
Автор: bsa 13.3.2013, 13:16 |
В любом случае, вопрос не соответствует разделу. Следует задавать в WinAPI. |
Автор: Afinogen 13.3.2013, 13:43 | ||
Пробовал разные опции -Wl,--subsystem,windows -mwindows не помогло... Вариант что программа сама отцепляется от консоли похож на правду, т.к. консольные приложения не отцепляются от cmd но куда копать пока не пойму bsa, я думал это опции линковщика, перенесите пожалуйста в нужный раздел. |
Автор: Afinogen 13.3.2013, 15:44 | ||
Нашел решение, возможно не совсем красивое
Узнаем позицию курсора в консоли, для не консольных приложений это х=0 у=0, для консольных у будет больше 0 ![]() |
Автор: leniviy 13.3.2013, 22:46 |
В Netbeans делают не консольное приложение и используют функцию "AttachConsole", затем fopen("CON"). http://hg.netbeans.org/main-golden/file/2da7b1f9de9b/o.n.bootstrap/launcher/windows/utilsfuncs.cpp#l343 |
Автор: Afinogen 13.3.2013, 23:28 |
leniviy, AttachConsole создает отдельное окно cmd для вызвавшей эту функцию программы, это тоже самое что и параметр линковщика -mwindows. Мне не нужно чтобы пользователь после дабл клика по ярлыку с программой видел окно с консолью, нужно чтобы данные выводились в консоль только при вызове программы из консоли. P.S. может я чего не понял в исходнике NetBeans, время позднее... |
Автор: GremlinProg 18.3.2013, 15:37 |
Afinogen, как вариант - написать консольное приложение-switch'ер, которое бы смотрело на свою строку запуска и в случае, если к GUI требовался бы дополнительный консольный вывод - создавала бы пайп и передавало бы его каким-то образом в GUI, например: через командную строку для CreateProcess, а GUI уже подхватывал этот пайп и писал в него все что надо. В таком случае, switch'ер должен редиректить вывод из пайпа в свою консоль до тех пор, пока дочерний процесс не будет завершен. Добавлено через 42 секунды в таком случае, switch'ер - исходная точка запуска приложения Добавлено через 4 минуты и 22 секунды только при запуске из проводника придется запускать GUI-приложение напрямую (минуя switch'ер), чтобы не появлялась консоль |
Автор: GremlinProg 18.3.2013, 15:55 |
По сути, сам факт задействования switch'еа - альтернатива Вашего флага, т.е. можно ни каких проверок switch'у и не делать, достаточно в GUI проверить наличие пайпа в своей командной строке. |
Автор: Dem_max 18.3.2013, 17:15 |
все легко и просто: 1. При запуске твоего процесса определить, кто вызвал CreateProcess который запустил программу. 2. Если это cmd, создать окно Windows и привязать ввод и вывод к cmd породивший твой процесс. 3. Если твою программу породил не cmd, просто создать окно Windows. |
Автор: xvr 19.3.2013, 11:51 |
Если вы хотите, что бы при запуске вашего приложения из консоли оно начало выводит данные в эту же консоль, то вы обязанны сделать свое приложение консольным. В противном случае вы не сможете получить доступ к консоли родительского процесса. При запуске консольного приложения из под Проводника всегда будет появляться новая консоль, но ее можно оперативно убить из самого приложения позвав FreeConsole() IMHO сделать по другому не получится, т.к. таков способ обработки консоли в самой Windows |
Автор: xvr 19.3.2013, 17:05 | ||||
При этом будет кратковременно выскакивать консоль при старте из проводника. Вариант с -
требует от пользователя знать где и какое именно приложение нужно запускать. Возможно ТС это устроит, а может и нет ![]() |
Автор: GremlinProg 19.3.2013, 21:23 | ||||
Точно так же, как и с FreeConsole, собственно поэтому я и предлагаю запускать из проводника GUI напрямую
Аналогично - флаг требует от пользователя знание о том, как такое приложение запускать |
Автор: leniviy 19.3.2013, 21:43 | ||
Этого не будет. Там AttachConsole вызывается по условию, если родитель тоже консоль. |
Автор: leniviy 19.3.2013, 22:47 | ||
вот рабочий пример под Visual Studio. При запуске guiconsole.exe из проводника консоль не появляется, а из консоли выводит на неё:
|
Автор: xvr 20.3.2013, 08:07 |
Действительно, http://msdn.microsoft.com/en-us/library/windows/desktop/ms681952%28v=vs.85%29.aspx проблему полностью решает. Не знал. PS. В приложенных исходниках смотреть в файл guiconsole/guiconsole/netbeans/o.n.bootstrap/launcher/windows/utilsfuncs.cpp Функции setupProcess и isConsoleAttached и printToConsole |
Автор: ncr 27.3.2013, 13:44 | ||
За такой подход надо больно бить по рукам. "Консоль" бывает не только cmd, но и, например, far. Запустив оттуда ваше творение будет очень приятно наблюдать эту "информацию". По-хорошему надо обрабатывать ключи комстроки и цепляться к консоли только если это действительно запросили. |
Автор: Afinogen 28.3.2013, 22:17 |
Всем спасибо за содействие, писалась курсовая на заказ. И сдавалась с моим вариантом решения сей проблемы. Потому что включение кода из NetBeans оказалась слишком круто)) leniviy, спс за пример взял на заметку. ncr, какое ТЗ дали так и делал. Если честно сам фаром не пользуюсь, да и смысл его употребления в винде... Но это как говориться на вкус и цвет фломастеры разные ![]() |