2009-09-23 1 views
2

У моей компании большое приложение Windows с моделью документа-объекта: откройте приложение, откройте файл, внесите некоторые изменения, сохраните, закройте. Я пытаюсь отключить графический интерфейс сверху и создать консольное приложение, которое принимает некоторые параметры, открывает файл, делает что-то полезное, сохраняет, закрывает файл и завершает работу. Поскольку существует большой код устаревшего кода, я вынужден использовать приложение форм VCL и запускать его из командной строки (или пакетного скрипта). Мне действительно нужно иметь возможность печатать на stdout, чтобы я мог писать сообщения о состоянии, отвечать на такие параметры, как «--version» и «-?». Я потратил все утро на поиск Google по этой теме, и я не нашел ничего полезного.VCL формирует заявку на запись в stdout

Приложение написано на CodeGear C++ Builder 2007 с использованием VCL.

ответ

1

Вы можете написать в STDOUT в программе GUI, там обычно не будет никакого выхода, так как Консоль отсутствует, если только она не запускается с реальной консоли. Кроме того, посмотрите на функции GetStdHandle() и WriteConsole() в API Win32. Если GetStdHandle() возвращает действительный дескриптор, вы можете написать ему. Это особенно полезно, если ваше приложение GUI запускается другим приложением, которое хочет перехватить ваш выход STDOUT для своих целей.

+0

Хмм, я до сих пор не использовал консольный вывод, но я попробую это, когда вернусь к нему. Благодарю. –

0

Используйте {$ APPTYPE CONSOLE} в своем файле проекта. Это выделит консоль (даже если ваше приложение все еще основано на формах).

В качестве альтернативы вы можете выполнять ветвление на основе параметров командной строки в файле проекта (.DPR) (код Delphi следует за вами, чтобы преобразовать в эквивалент C++ Builder). Вы по-прежнему необходимо определение APPTYPE, или вам необходимо использовать Win32 функции консоли API, чтобы создать свою собственную консоль (см MSDN Console Functions для получения дополнительной информации):

begin 
    if ParamCount() > 0 then 
    DoWhateverTheConsoleAppWouldDoHere() 
    else 
    begin 
    Application.Initialize; 
    Application.CreateForm(TForm1, Form1); 
    Application.Run; 
    end; 
end; 
+1

APPTYPE применяется к Delphi, а не к C++ Builder. Для C++ нет эквивалентности. Джонатану нужно создать реальный проект «Консоль», а не проект GUI. –

+0

Ах. Спасибо, Реми, за исправление. Я предполагаю, что реальный способ сделать это - с консольными функциями, которые я назвал Джонатаном в своем ответе. –

2

Если вы хотите просто показать окно консоли, вы можете позвонить в AllocConsole и FreeConsole. Тогда вы можете просто вызвать WriteLn ('xxx'), как обычно, с помощью приложения консоли. Однако, если вы запустите это приложение из командной строки, оно все равно создаст новую консоль, и стандартный вывод будет отправлен на новую консоль, а не на вызывающую консоль.

AllocConsole и FreeConsole прототипированы в блоке Windows.

 Смежные вопросы

  • Нет связанных вопросов^_^