Можно перехватить ввод/вывод консольного приложения.
Я делаю это так:
[syntax="delphi"] var
hOutRead, hOutWrite: THandle;
hInRead, hInWrite: THandle;[/syntax]
Создание пайпов для передачи данных и запуск нити чтения:[syntax="delphi"]var
tid: Cardinal;
sa: TSecurityAttributes;
begin
ZeroMemory(@sa, SizeOf(TSecurityAttributes));
sa.nLength := SizeOf(TSecurityAttributes);
sa.bInheritHandle := True;
if not CreatePipe(hOutRead, hOutWrite, @sa, 0) then
Raise Exception.Create('Can''t create pipe');
if not CreatePipe(hInRead, hInWrite, @sa, 0) then
Raise Exception.Create('Can''t create pipe');
CreateThread(nil, 0, @ReadThread, Self, 0, tid);
end;[/syntax]
Нить чтения данных: [syntax="delphi"]function ReadThread(Param: TForm1): Integer; stdcall;
var
temp: array[0..1023] of char;
dwBytesRead: Cardinal;
begin
while not Application.Terminated do
begin
ZeroMemory(@temp, 1024);
ReadFile(hOutRead, temp, 1024, dwBytesRead, nil);
OemToAnsiBuff(@temp, @temp, dwBytesRead);
// в буфере данные, выведенные консольным приложением.
end;
Result := 0;
end;[/syntax]
запуск процесса с переопределенными стандартными устройствами ввода/вывода:[syntax="delphi"]var
si: TStartupInfo;
pi: TProcessInformation;
filen: String;
begin
with TOpenDialog.Create(Self) do
try
if not Execute then Exit;
if not FileExists(FileName) then Exit;
filen := FileName;
finally
Free;
end;
ZeroMemory(@si, SizeOf(TStartupInfo));
si.hStdInput := hInRead;
si.hStdOutput := hOutWrite;
si.hStdError := hOutWrite;
si.dwFlags := STARTF_USESTDHANDLES or STARTF_USECOUNTCHARS or STARTF_USESHOWWINDOW;
si.wShowWindow := SW_HIDE;
si.dwXCountChars := 1;
si.dwYCountChars := 1;
CreateProcess(nil, PChar(filen), nil, nil, True, 0, nil, nil, si, pi);
repeat
Application.ProcessMessages;
until (WaitForSingleObject(pi.hProcess, 100) <> WAIT_TIMEOUT) or Application.Terminated;
CloseHandle(pi.hThread);
CloseHandle(pi.hProcess);
end;[/syntax]
посылка строки консольному приложению (оно думает, что его набрали на клавиатуре

[syntax="delphi"]var
dwBytesRead: CArdinal;
s: String;
begin
s := edit1.Text + #13#10;
WriteFile(hInWrite, s[1], Length(s), dwBytesRead, nil);
edit1.Text := '';
end;[/syntax]
ну и в конце закроем хендлы:[syntax="delphi"] CloseHandle(hOutWrite);
CloseHandle(hOutRead);[/syntax]
P.S. выдрано с живого проекта, так что кое-что возможно придется подредактить.