четверг, 23 декабря 2010 г.

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

Это перевод How to make an application as both GUI and Console application? Автор: Junfeng Zhang.

Вот ещё один часто задаваемый вопрос. Но на этот раз это вопрос по Win32.

В Windows GUI и консольные приложения являются совершенно разными. У GUI приложений есть хотя бы одно окно и цикл выборки сообщений, но нет стандартных каналов ввода-вывода. У консольных приложений есть каналы ввода-вывода, но нет окна и цикла обработки сообщений. Приложение может быть либо GUI, либо консольным, но не обоими сразу.

Некоторые люди хотят, чтобы их приложение работало различным образом, в зависимости от входных данных. Если им задают параметр, то они работают как консольные, если не передают - то как GUI приложение.

Прямо как devenv (Visual Studio) и ildasm.

Как они это делают?

VisualStudio и ildasm достигают этой цели различными способами.

В случае с VisualStudio, существует две различные программы: devenv.com и devenv.exe. Devenv.com является консольной программой, а devenv.exe - GUI приложением. Когда вы печатаете devenv в командной строке, то запускается devenv.com из-за правил поиска имени программы в Windows. Если devenv.com не находит параметров командной строки, то он просто запускает devenv.exe и выходит. Если параметры есть, то devenv.com обрабатывает их как обычное консольное приложение. А ярлыки и ассоциации Оболочки ссылаются на devenv.exe, что запускает GUI программу.

В случае с ildasm, есть только одна программа: ildasm.exe. Сначала она компилируется как GUI приложение. Затем используется editbin.exe, чтобы пометить её как консольную. В своём главном коде она определяет, нужно ли ей работать в консольном или GUI режиме. Если ей надо работать в GUI, то ildasm.exe перезапускает себя как GUI приложение.

P.S. Вот ответ от автора ildasm:
Вообще-то тут есть целая история.

Изначально ILDASM был консольной программой, которая по умолчанию снимала дамп и отправляла его в консольное окно, либо же запускала GUI, если её об этом просили опцией в командной строке. Люди стали жаловаться, что когда они запускают ILDASM в GUI режиме из консольного окна, то она не отпускает консоль (конечно же она это не делает - ведь это консольное приложение).

OK, тогда я сделал ILDASM GUI программой и GUI режим был сделан умалчиваемым. Запускаясь из консольного окна в GUI режиме ILDASM немедленно отпускал консоль. Люди стали жаловаться, что они хотят получить дамп дизассемблера в консольное окно.

OK, тогда я добавил показ консольного окна, когда заказывали сбор дампа. ILDASM по-прежнему отпускал исходную консоль, но он открывал новое консольное окно, когда его просили, и выводил туда текст. Люди стали жаловаться, что они не могут перенаправить дамп в файл. Почему им хочется делать именно "ildasm MyApp.dll /text > MyApp.il" вместо "ildasm MyApp.dll /out=MyApp.il" - до сих пор остаётся для меня загадкой.

OK, тогда я сделал ILDASM GUI-замаскированное-в-консольное приложением. Оно освобождает консольное окно в GUI режиме, оно сбрасывает дамп в консольное окно, и вы можете перенаправить вывод в файл. Люди стали жаловаться, что когда ILDASM запускают из Проводника Windows, то моргает консольное окно. Извините, ребята, я боюсь, что это нельзя изменить, не нарушив какой-то из предыдущих пунктов.

1 комментарий:

  1. Я тоже пробовал сделать такое, когда делал LazyDelphiBuilder. Попробовал и так и эдак. перелопатил программу вдоль и поперёк. Потратил кучу времени. В конце-концов решил что проще всего компилировать 2 отдельные экзешки.

    ОтветитьУдалить

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

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

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

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

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