![]() |
Проблема с запуском консольной программы и получением ее вывода
Проблема, бьюсь дня 4 итак нам нужно запустить консольное приложение и получить его вывод, перечитал кучю статей, сходил на MSDN фсе бестолку, или то что я беру идет с ошибкой, которую я исправляю но потом делфи CodeGear 2009 вылетает с ошибкой выполнения вот прошу работающий пример а то хоть перенаправляй в файл а потом от туда пастрочно читай, заранее благодарен
|
Возможно тебе поможет пример с использованием пайпов из темы https://forum.antichat.ru/showthread.php?t=34115.
|
Цитата:
OemToAnsi(Buffer,Buffer); Ругаеццо на несовместимость типов поставил PAnsiChar и вуаля ошибка выполнения ((( |
Цитата:
|
Цитата:
|
Цитата:
|
http://programmersforum.ru/showthread.php?t=8725
подкорректируй только немного. |
Цитата:
|
ВСЕ ВСЕМ СПАСИБО, сам нашол выход через файлы, тему сисег можно закрыть !!!
|
Всетаки ИМХО нужно было разобраться с пайпами. Пошел по легкому пути, но потерял в производительности. Получается не код а херь. Почитай.
|
сам не юзал, но попробуй:
Код:
{----------------------------CreateDOSProcessRedirected--------------------------- |
CreateProcess, который возвращает консольный вывод
Код:
procedure ExecConsoleApp(CommandLine: AnsiString; Output: TStringList; Errors: |
Код:
procedure RunDosInMemo(CmdLine: string; AMemo: TMemo); |
Код:
constCорри что в несколько постов.. Может поможет что) |
кароче если чесно нифига не помогло, ошибка при выполнении создания пайпа, хоть убейся не знаю или у меня руки кривые или дефи кривой, кароче вот код который у меня пашет
зы помогло тока 1, но всерамно спасиба чювак ------------------ unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; Edit1: TEdit; Memo2: TMemo; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private function RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean; { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} function StrOemToAnsi(const S: AnsiString): AnsiString; begin SetLength(Result, Length(S)); OemToAnsiBuff(@S[1], @Result[1], Length(S)); end; procedure TForm1.Button2Click(Sender: TObject); var i: integer; begin for i:=0 to Memo1.Lines.Count do begin memo2.Lines.Add(StrOemToAnsi(AnsiString(memo1.Line s[i]))); end; end; function TForm1.RunCaptured(const _dirName, _exeName, _cmdLine: string): Boolean; var start: TStartupInfo; procInfo: TProcessInformation; tmpName: string; tmp: Windows.THandle; tmpSec: TSecurityAttributes; res: TStringList; return: Cardinal; begin Result := False; try { Set a temporary file } tmpName := 'Test.tmp'; FillChar(tmpSec, SizeOf(tmpSec), #0); tmpSec.nLength := SizeOf(tmpSec); tmpSec.bInheritHandle := True; tmp := Windows.CreateFile(PChar(tmpName), Generic_Write, File_Share_Write, @tmpSec, Create_Always, File_Attribute_Normal, 0); try FillChar(start, SizeOf(start), #0); start.cb := SizeOf(start); start.hStdOutput := tmp; start.dwFlags := StartF_UseStdHandles or StartF_UseShowWindow; start.wShowWindow := SW_Minimize; { Start the program } if CreateProcess(nil, PChar(_exeName + ' ' + _cmdLine), nil, nil, True, 0, nil, PChar(_dirName), start, procInfo) then begin SetPriorityClass(procInfo.hProcess, Idle_Priority_Class); WaitForSingleObject(procInfo.hProcess, Infinite); GetExitCodeProcess(procInfo.hProcess, return); Result := (return = 0); CloseHandle(procInfo.hThread); CloseHandle(procInfo.hProcess); Windows.CloseHandle(tmp); { Add the output } res := TStringList.Create; try res.LoadFromFile(tmpName); Memo1.Lines.AddStrings(res); finally res.Free; end; Windows.DeleteFile(PChar(tmpName)); end else begin Application.MessageBox(PChar(SysErrorMessage(GetLa stError())), 'RunCaptured Error', MB_OK); end; except Windows.CloseHandle(tmp); Windows.DeleteFile(PChar(tmpName)); raise; end; finally end; end; procedure TForm1.Button1Click(Sender: TObject); begin RunCaptured('E:\', 'cmd.exe', '/c' + edit1.Text); end; end. |
| Время: 18:45 |