Реализация перенаправления ввода / вывода в консольном приложении Delphi - PullRequest
1 голос
/ 26 августа 2010

У меня есть приложение Delphi 7 (не 2007) (назовем его App1.exe), которое IDE думает, что это приложение с графическим интерфейсом, но в DPR, компилятор директива, которая делает это в консольном приложении. Пример:

{$IFDE MAKE_CONSOLE}
  {$APPTYPE CONSOLE}
{$ENDIF MAKE_CONSOLE}

В процессе сборки может быть определен MAKE_CONSOLE.

У меня проблема в том, что у нас есть другое консольное приложение (скажем, App2.exe), который запускает App1.exe с помощью WinAPI CreateProcess. когда происходит, выход из App1.exe нигде не видно :-( Когда App1.exe запускается прямо из командной строки (cmd.exe), вывод отображается в окне командной строки.

Я предполагаю, что мне нужно перенаправить вывод из App1.exe в CreateProcess, используя структуру STARTUPINFO. Я не уверен что Я должен быть здесь.

Другая информация: * Используются dwCreationFlags: CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS + DEBUG_PROCESS (да, App2 отлаживает App1)

  • 'bInheritHandles' имеет значение false (это необходимо изменить?).

  • И 'lpProcessAttributes', и 'lpThreadAttributes' равны нулю, как и 'lpEnvironment' и 'lpCurrentDirectory'.

Я пропустил какую-либо информацию, которая необходима мне, чтобы помочь?

Любые указатели были бы великолепны!

Большое спасибо заранее.

Ответы [ 4 ]

1 голос
/ 27 августа 2010

Вот некоторый код, который я использую для вызова программ командной строки из Deplhi 7.

Он может перенаправить на текущую консоль (основного вызывающего exe-файла), если вы установите параметр «Visibility» в 0вместо "SW_SHOWNORMAL".

function WinExecAndWait(const FileName: String; Visibility: integer): cardinal;
var StartupInfo: TStartupInfo;
    ProcessInfo: TProcessInformation;
    Options: cardinal;
begin
  FillChar(StartupInfo,Sizeof(StartupInfo),0);
  StartupInfo.cb := Sizeof(StartupInfo);
  StartupInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartupInfo.wShowWindow := Visibility;
  if Visibility=0 then begin
    Flush(Output);
    Options := NORMAL_PRIORITY_CLASS;
  end else
    Options := CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS;
  if not CreateProcess(nil,
     pointer(FileName),             { pointer to command line string }
     nil,                           { pointer to process security attributes }
     nil,                           { pointer to thread security attributes }
     false,                         { handle inheritance flag }
     Options,                       { creation flags }
     nil,                           { pointer to new environment block }
     nil,                           { pointer to current directory name }
     StartupInfo,                   { pointer to STARTUPINFO }
     ProcessInfo) then              { pointer to PROCESS_INF }
    Result := cardinal(-1) else begin
    WaitforSingleObject(ProcessInfo.hProcess,INFINITE);
    GetExitCodeProcess(ProcessInfo.hProcess,Result);
  end;
end;
0 голосов
/ 16 декабря 2011

ConsoleApp от Martin Lafferty прекрасно работает для перенаправления вывода консольных программ.Вы получаете обработчик событий, который вызывается для каждой строки вывода на консоль.

Я не могу найти официальный дом для кода, но вот страница Embarcadero:

http://cc.embarcadero.com/Item/14692

0 голосов
/ 27 августа 2010

В этой статье MSDN обсуждается, как App2 может перенаправить вывод App1:

Создание дочернего процесса с перенаправленным вводом и выводом

0 голосов
/ 27 августа 2010

У вас случайно нет DETACHED_PROCESS в флагах создания процесса? Наследование родительской консоли должно быть по умолчанию.

...