Один исполняемый файл, который запускается как приложение с графическим интерфейсом пользователя или консольное приложение на основе командной строки в Visual Studio 2005.

У меня есть приложение Qt в Visual Studio 2005, который связан с использованием \subsystem:windows, так что когда я запускаю скомпилированный исполняемый файл, он также не создает терминал командной строки.

Я хотел бы создать режим командной строки: когда я запускаю его с аргументом командной строки --nogui, тогда графический интерфейс не отображается, но запускается простая программа командной строки. Поскольку для связывания используется /subsystem:windows, режим командной строки не показывает никаких выходных данных std::cout, если я не свяжу свой исполняемый файл с \subsystem:console.

Есть ли способ настроить компиляцию / компоновку таким образом, чтобы один и тот же исполняемый файл мог либо представлять окна графического интерфейса пользователя, либо вести себя как консольное приложение на основе параметров командной строки?

PS. Я использую Qt 4.2.0 и Visual Studio 2005, а проект написан на C ++.


person balint.miklos    schedule 21.04.2009    source источник


Ответы (4)


Я думаю, что в данной ситуации предпочтительнее использовать методы «.com» и «.exe». В Windows из командной строки, если вы запускаете программу и не указываете расширение, порядок приоритета при поиске исполняемого файла будет . com предпочтительнее файла .exe.

Затем вы можете использовать уловки, чтобы этот .com был прокси-сервером для stdin / stdout / stderr и запускал одноименный файл .exe. Это дает возможность программе преформироваться в режиме командной строки при вызове из консоли (возможно, только при обнаружении определенных аргументов командной строки), в то же время имея возможность запускаться как приложение с графическим интерфейсом без консоли.

Это описано в различных статьях, например «Как сделать приложение одновременно с графическим интерфейсом и консольным приложением?» (см. ссылки в ссылке ниже).

Я разместил проект под названием dualsubsystem в коде Google, который обновляет старый codeguru решение этой техники и предоставляет исходный код и рабочие примеры двоичных файлов.

Надеюсь, это поможет!

person gabeiscoding    schedule 05.07.2009

Вы не можете. См. Эту статью Раймонда Чена:

Как написать программу, которая может запускаться либо в виде консоли или приложения с графическим интерфейсом?

По причинам, указанным в этой статье, вы иногда видите две версии одного и того же инструмента, одна из которых имеет суффикс «w», например, в java.exe и javaw.exe в Windows.

Однако вы можете реализовать этот умный обходной путь: Как сделать приложение как и графический интерфейс, и консольное приложение.

person Dirk Vollmar    schedule 21.04.2009
comment
Извините, но в данном случае эта информация просто неверна, и AllocConsole будет работать нормально. Чего он не делает, так это создания новой консоли, когда ее нет, но об этом не спрашивали (поскольку здесь необходимо ввести дополнительный аргумент, чтобы запустить консольную версию в любом случае). Несколько человек также оставили этот комментарий к сообщению Раймонда. - person Konrad Rudolph; 21.04.2009
comment
Извините, я имел в виду AttachConsole, не AllocConsole (последний делает что-то еще). Еще я забыл слово: чехол. - person Konrad Rudolph; 21.04.2009
comment
@Konrad: Насколько я понимаю, AttachConsole будет работать, только если ваш родительский процесс - cmd.exe, т.е. запуск приложения с --nogui из ярлыка не будет работать. ИМХО нет общего решения этой проблемы, только некоторые обходные пути. - person Dirk Vollmar; 21.04.2009
comment
@divo: ваше понимание действительно правильное (хотя все равно можно было бы вернуться к AllocConsole, если родительский процесс не является cmd.exe - информация, которую можно получить с помощью других функций WinAPI). - person Konrad Rudolph; 22.04.2009

Вы пытались вызвать AttachConsole в своей программе, чтобы перенаправить вывод на вызывающий терминал?

person Konrad Rudolph    schedule 21.04.2009
comment
не могли бы вы подсказать, какие файлы заголовков и определение макроса мне нужно, чтобы иметь возможность использовать AttachConsole? Я пробовал #include ‹windows.h› #include ‹Wincon.h›, но, видимо, этого недостаточно, чтобы найти функцию AttachConsole - person balint.miklos; 21.04.2009
comment
В документации сказано включить <windows.h>, и этого определенно достаточно. Вы забыли аргумент при вызове функции? - person Konrad Rudolph; 21.04.2009
comment
AllocConsole () также может быть подходящим: msdn.microsoft.com/en-us/ библиотека / ms681944.aspx - person Raphaël Saint-Pierre; 21.04.2009
comment
У меня работает AllocConsole () и открывает новую консоль, даже если я начинаю с консоли. В любом случае спасибо за ответ - person balint.miklos; 21.04.2009
comment
Я попробовал это с помощью AttachConsole (ATTACH_PARENT_PROCESS), но компилятор сказал мне, что не находит идентификатор AttachConsole ... с #include ‹windows.h› - person balint.miklos; 21.04.2009

Чтобы использовать AttachConsole, вам необходимо включить следующую строку перед включением ‹windows.h>:

//Require at least Windows XP
#define _WIN32_WINNT 0x0501
person Bruce    schedule 09.03.2010