У меня есть приложение Windows (написано на C, скомпилировано с MSVC Express Edition, 32-битный режим), которое имеет два основных режима работы:
- Оконный режим - создайте окно и нарисуйте в нем вещи (а именно, фрактал).
- Режим эталонного теста - при запуске с
--benchmark
в качестве аргумента не создавать окно, а просто выводить некоторую статистику эталонного теста в стандартный вывод.
Во время разработки я скомпилировал как консольное приложение и использовал SDL для создания окна и выполнения других функций графического интерфейса. Таким образом, режим бенчмарка работает нормально (окно не создается), а в графическом режиме просто есть длительное окно консоли.
Однако для моей компиляции релиза я включил подсистему Windows вместо Console. (Как объяснено в этот вопрос ). Это прекрасно работает, за исключением того, что я вдруг обнаружил, что больше не могу запускать тесты. : О
Мне просто интересно, есть ли способ для приложения выбрать во время выполнения (например, на основании заданной командной строки), какой тип поведения подсистемы использовать?
Я провел некоторые эксперименты с файлами EXE в Windows (проводник, блокнот, winword), и ни один из них, похоже, ничего не выводил на консоль при запуске с аргументом, подобным "/?" (который поддерживает большинство консольных приложений Windows). Так что это не похоже на это, но я подумал, что стоит спросить здесь, если есть особый трюк.
Обновление. Похоже, нет, вы не можете. Спасибо за ответы, ребята.
Дополнительный академический вопрос. Означает ли это, что выбор подсистемы отмечен в заголовке EXE, и именно операционная система проверяет это и настраивает окно или подключает его к консоли, из которой запускается? Я не знаю много о загрузке EXE, но мне было бы интересно узнать несколько деталей здесь.
Заключение. Я думаю, что есть четыре хороших решения (плюс два полу-решения, всего пять: p) на выбор:
- Используйте консольную подсистему, но используйте FreeConsole при работе в режиме графического интерфейса.
- Используйте систему Windows и AllocConsole при работе в режиме тестирования. Не идеально, если fractal.exe запускается с существующей консоли, поэтому я считаю это половиной решения; -).
- Просто используйте один исполняемый файл для каждой подсистемы, fractal.exe и fractalgui.exe.
- Иметь два (или более) исполняемых файла, один из которых выполняет свою работу и передает ее другому, чтобы отобразить его на консоли или в соответствующем окне. Нужно немного подумать о том, как разделить программы и как общаться между ними.
- Еще одно половинное решение: пусть fractalgui.exe распечатает эталонный эталонный тест и передаст его утилите, которая просто распечатает его.
Я еще не выбрал, но я склоняюсь к # 3.
Спасибо Маттео и Смерлину за идеи!