Подтвердить что ты не робот

Программируйте как консоль, так и графический интерфейс

Возможно ли (и если да, как я) сделать одну работу программы как консольного приложения, так и версии GUI с использованием Delphi 2007?

Что мне нужно, так это то, что если программа запускается с соответствующими параметрами командной строки, она должна работать как консольная программа, печатая вывод на консоль с помощью WRITELN, но если аргументы командной строки не заданы, она должна работать как обычное приложение для графического интерфейса Delphi?

Ловушка заключается в том, что при запуске в качестве консольного приложения интерпретатор командной строки ждет завершения приложения, прежде чем разрешить вам вводить новую команду, тогда как приложение GUI, запущенное из командной строки, немедленно возвращает вас в командную строку и приложение GUI запускается в отдельном процессе. Я хочу сохранить это поведение.

Я не против чего-то вроде этого:

IF GUI THEN StartApplicationAsGUI (ParamStr (0))

т. Я не против, что мне придется перезапустить приложение, используя какой-либо вызов EXECUTE, чтобы запустить его в режиме графического интерфейса, если это необходимо, если интерфейс командной строки возвращается к вводу командной строки при запуске версии графического интерфейса.

Я бы предпочел решение/предложение, которое соответствует строкам:

< Parse Comnand Line >
IF ConsoleMode THEN
    RunConsole (Параметры)
ELSE BEGIN
    Application.Initialize;
    Application.CreateForm(...)
    Application.Run;
END

(или наоборот, т.е. делать что-то особым образом, если режим GUI)

чтобы я мог использовать Delphi IDE и VCL при создании интерфейса GUI...

4b9b3361

Ответ 2

В Windows это немного сложно. На самом деле различие между консольным приложением и графическим интерфейсом - это один флаг в заголовке PE. Вы можете легко писать консольные приложения, которые создают окна, но при этом у вас всегда есть консольное окно (вы можете скрыть его, но это было бы неплохо, когда люди запускали вашу программу из cmd).

Однако вы можете написать приложение GUI, которое создает консоль, если это необходимо, используя функцию AllocConsole:

Процесс может быть связан только с одной консолью, поэтому функция AllocConsole завершается с ошибкой, если в вызывающем процессе уже есть консоль. Процесс может использовать функцию FreeConsole, чтобы отделить себя от текущей консоли, затем она может вызывать AllocConsole, чтобы создать новую консоль или AttachConsole, чтобы подключиться к другой консоли.

Если вызывающий процесс создает дочерний процесс, дочерний элемент наследует новую консоль.

AllocConsole инициализирует стандартный ввод, стандартный вывод и стандартные дескрипторы ошибок для новой консоли. Стандартный дескриптор ввода - это дескриптор входного буфера консоли, а стандартные выходные и стандартные дескрипторы ошибок - это ручки для буфера экрана консоли. Чтобы получить эти ручки, используйте GetStdHandle.

Эта функция в основном используется графическим интерфейсом пользователя (GUI) для создания окна консоли. Приложения GUI инициализируются без консоли. Консольные приложения инициализируются консолью, если они не созданы как отдельные процессы (вызывая функцию CreateProcess с помощью DETACHED_PROCESS).

Однако при запуске с cmd это приведет к появлению другого окна консоли вместо повторного использования существующего. Я не знаю, существует ли там хорошее решение.

Ответ 3

IMO, лучшим подходом здесь является наличие невизуальных классов, которые фактически выполняют работу программы. Затем вы можете вызвать это из программы GUI, и вы также можете вызвать ее из отдельной программы командной строки. Обе программы - это всего лишь обертки вокруг функциональности вашего класса.

Это заставляет дизайн быть чистым - ваши классы обязательно отделены от уровня GUI вашего приложения.

Ответ 4

Windows имеет разные значения в исполняемом заголовке для консольного и пользовательского интерфейса (см. подробнее здесь). Таким образом, невозможно сделать один и тот же исполняемый файл для работы в обоих режимах.

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

Ответ 5

AttachConsole() может использоваться для удержания консоли для родителей. Например. если приложение запущено из оболочки cmdline, AllocConsole() можно избежать:

if not AttachConsole(ATTACH_PARENT_PROCESS)
then AllocConsole;

Подробнее здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms681952(v=vs.85).aspx