Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > 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
Печалька  smile

Автор: 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
Код

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, 15:44
Нашел решение, возможно не совсем красивое
Код

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

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

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

Узнаем позицию курсора в консоли, для не консольных приложений это х=0 у=0, для консольных у будет больше 0  smile 

Автор: 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

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

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

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

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

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

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

Автор: GremlinProg 19.3.2013, 21:23
Цитата(xvr @  19.3.2013,  19:05 Найти цитируемый пост)
При этом будет кратковременно выскакивать консоль при старте из проводника. Вариант с -

Точно так же, как и с FreeConsole, собственно поэтому я и предлагаю запускать из проводника GUI напрямую
Цитата(xvr @  19.3.2013,  19:05 Найти цитируемый пост)
требует от пользователя знать где и какое именно приложение нужно запускать. Возможно ТС это устроит, а может и нет   

Аналогично - флаг требует от пользователя знание о том, как такое приложение запускать

Автор: leniviy 19.3.2013, 21:43
Цитата(Afinogen @ 13.3.2013,  23:28)
leniviyМне не нужно чтобы пользователь после дабл клика по ярлыку с программой видел окно с консолью

Этого не будет. Там AttachConsole вызывается по условию, если родитель тоже консоль.

Автор: leniviy 19.3.2013, 22:47
вот рабочий пример под Visual Studio. При запуске guiconsole.exe из проводника консоль не появляется, а из консоли выводит на неё: 
Код

The launcher has determined that the parent process has a console and will reuse it for its own console output.
Closing the console will result in termination of the running program.
Use '--console suppress' to suppress console output.
Use '--console new' to create a separate console window.
aaa
bbb
ccc

Автор: xvr 20.3.2013, 08:07
Цитата(leniviy @  19.3.2013,  22:47 Найти цитируемый пост)
вот рабочий пример под Visual Studio.

Действительно, 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 информация должна выводиться и в консоль и на форму.

За такой подход надо больно бить по рукам.
"Консоль" бывает не только cmd, но и, например, far. Запустив оттуда ваше творение будет очень приятно наблюдать эту "информацию".

По-хорошему надо обрабатывать ключи комстроки и цепляться к консоли только если это действительно запросили.

Автор: Afinogen 28.3.2013, 22:17
Всем спасибо за содействие, писалась курсовая на заказ. И сдавалась с моим вариантом решения сей проблемы. Потому что включение кода из NetBeans оказалась слишком круто))
leniviy, спс за пример взял на заметку.

ncr, какое ТЗ дали так и делал. Если честно сам фаром не пользуюсь, да и смысл его употребления в винде... Но это как говориться на вкус и цвет фломастеры разные  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)