Запустить консольное приложение и получить его стандартный вывод

Советы » DOS и Консоль » Запустить консольное приложение и получить его стандартный вывод

{ 
This function runs a program (console or batch) and adds its output 
to Memo1 
} 

{....} 
  private

function

RunCaptured(const

_dirName, _exeName, _cmdLine: string

): Boolean; {....} 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

{ Setze ein Temporares File } { 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; { Starte das Programm } { 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); { Die Ausgaben hinzufugen } { 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(GetLastError())), 'RunCaptured Error', MB_OK); end

; except

Windows.CloseHandle(tmp); Windows.DeleteFile(PChar(tmpName)); raise

; end

; finally

end

; end

; // Example: procedure

TForm1.Button1Click(Sender: TObject); begin

RunCaptured('C:', 'cmd.exe', '/c dir'); end

;

Другое по теме:

Категории

Статьи

Советы

Copyright © 2022 - All Rights Reserved - www.delphirus.com