2014-12-29 1 views
0

Я создаю процесс командной строки в своем приложении Delphi, который может взаимодействовать с JDB для компиляции, запуска и отладки приложения Java. Cmd ввод/вывод/ошибки обрабатываются путем конвейерной обработки из cmd в/из моего пользовательского интерфейса приложения Delphi.Консоль Java Ввод/вывод/Перенаправление ошибок в другое приложение (Delphi)

Я хочу, чтобы выход программы java при использовании 'System.out'/'System.err' был направлен на компонент моего приложения Delphi, и я хочу, чтобы вход из моего приложения delphi отправлялся в 'System. в 'позволяя мне сформировать консоль в моем интерфейсе Delphi, подобном консоли в Eclipse IDE.

Несколько мыслей о подходах;

  • Неизвестная флаг (я не нашел) в компилятор Java позволяет мне перенаправить
  • Использование «System.setOut»/«System.setErr»/«» System.setIn вместе с основным методом в классе, который выполняет эту инициализацию, прежде чем указывать на обычный основной метод для запуска кода пользователя.

NB - Я попытался найти исходный код Eclipse, чтобы узнать, как они это сделали, но поскольку он написан на Java, я подозреваю, что они не столкнутся с проблемами на разных языках, с которыми я столкнулся.

+0

Возможный дубликат [Получение вывода из приложения оболочки/dos в приложение Delphi] (http://stackoverflow.com/questions/9119999/getting-output-from-a-shell-dos-app-into-a -delphi-app) –

+0

Я уже достиг того, о чем говорит ваш предложенный вопрос (конвейерная обработка), это касается того, куда идет Java System.in/out/err и как перенаправить его в приложение Delphi. Конвейерная обработка требует, чтобы процесс работы работал, насколько я знаю, и пока я делаю Java-приложение, я не могу контролировать конструкцию Java-консоли. Кроме того, конвейерная обработка использует указатели, которые, как я полагаю, не существуют в какой-либо форме на Java. –

+0

ОС уже предоставляет все необходимое. Когда процесс запускается, вы поставляете три стандартных ручки. –

ответ

0

Я нашел решение моей проблемы. Вам нужно два процесса командной строки, каждый из которых сконструирован с помощью канала Read, Write и Error в Delphi.

Один из них запускает приложение Java и настроен на ожидание присоединения отладчика до его выполнения, а другой для отладки и прикрепляется к ожидающему Java-приложению.

Это для основного применения; все процессы ввода/вывода/консоли приложения будут обрабатываться через этот процесс.

java -agentlib:jdwp=transport=dt_shmem,address=DelphiExecutingAppAddress,server=y,suspend=y MyClassFile.java 

Это для отладчика; все входные/выходные/ошибки консоли jdb будут обрабатываться через этот процесс (точки останова, возобновление, получение деталей объекта).

jdb -attach DelphiExecutingAppAddress 

N.B. Возможно, это то, о чем говорил Давид? Похоже, что это была моя ошибка при чтении документации jdb, не обнаружив этого при первом прохождении. Возможно, эта нить может помочь другим.