пятница, 24 декабря 2010 г.

Как мне написать программу, которая может работать как консольная или как GUI приложение?

Это перевод How do I write a program that can be run either as a console or a GUI application? Автор: Реймонд Чен.

Вы не можете, но вы можете подделать это поведение.

Каждое PE приложение содержит поле в своём заголовке, которое определяет, для какой подсистемы было сделано это приложение. Вы можете сказать там IMAGE_SUBSYSTEM_WINDOWS_GUI, чтобы указать что вы - GUI приложение. Или вы можете пометить себя IMAGE_SUBSYSTEM_WINDOWS_CUI, говоря что вы - консольное приложение. Если вы - GUI программа, то вы запускаетесь без консоли.

Подсистема определяет, как ядро должно подготавливать рабочее окружение для программы. Если программа отмечена как консольная, то ядро соединит консоль программы с консолью родителя (вызывающего) или создаст новую консоль, если у родителя консоли нет (это не полное описание, но детали здесь не важны). С другой стороны, если программа помечена как GUI, то ядро запустит программу вообще без консоли.

Есть люди, которым хочется написать то, что я называю "оппортунистической консольной программой". Такие программы будут использовать консоль, если она доступна у родителя, но они не хотят иметь консоль, если её не было у родителя. Ядро не поддерживает такой тип программ, но это не остановливает людей от придумывания хитрых обходных путей. Заметьте, что если бы такой тип программ существовал бы, то он создал бы проблемы с такими программами как cmd.exe и Проводник, которые меняют своё поведение в зависимости от типа подсистемы программы. Пришлось бы модифицировать эти программы, которым теперь надо понимать новый тип программ: "обе системы".

Я также видел запросы о том, что я называю "динамическая консольная программа". Это программы, которые сами решают во время выполнения, нужна им консоль или нет. К примеру, программа может захотеть быть консольной только если указаны какие-то параметры командной строки. Чтобы провернуть такой трюк ядру нужно иметь немалую силу телепатии: ему надо узнать, надо ли прикреплять к программе консоль или нет (что случается до момента, когда код программы получит управление), основываясь на том, что произойдёт в будущем (когда ваша программа наконец запустится, проанализирует аргументы командной строки и решит, хочет ли она работать как консольная или как GUI). И снова - люди придумали обходные пути.

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.