![]() |
Kommandozeilen-Programm ausführen, dessen Ausgabe in Listbox
Ich möchte aus Delphi heraus ein Kommandozeilenprogramm aufrufen und dessen Ausgabe in eine Listbox in meinem Programm anzeigen.
Wie macht man das? ShellExecute scheint wohl nicht das Allheilmittel zu sein für solche Aufgaben. |
Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis
|
Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis
Ich weiß nicht von wem der Code ist, ob von mir oder aus dem Internat, aber ich hab den schon ewig. Sollte ein Programmierer seine Funktion erkennen, dann soll er sich melden und ich trage die Credits nach.
Der Code besteht aus zwei Teilen, der eigentlichen Funktion und einem Beispielaufruf.
Delphi-Quellcode:
function RunCaptured(const _dirName, _exeName, _cmdLine: string): String;
var TmpName: string; TmpSec: TSecurityAttributes; Tmp: Windows.THandle; Start: TStartupInfo; ProcInfo: TProcessInformation; Res: TStringList; Return: Cardinal; begin try 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; 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); CloseHandle(ProcInfo.hThread); CloseHandle(ProcInfo.hProcess); Windows.CloseHandle(Tmp); Res := TStringList.Create; try Res.LoadFromFile(TmpName); Result := Res.Text; 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; procedure TForm1.FormCreate(Sender: TObject); var sl: TStringlist; i: Integer; s: String; begin s := RunCaptured('C:\', 'ipconfig.exe', '/all'); s := Trim(s); sl := TStringList.Create; try begin sl.Text := s; { Leerzeilen entfernen } for i := sl.Count -1 downto 0 do begin if sl.Strings[i] = '' then sl.Delete(i); end; {} s := sl.Text; end; finally sl.Free; end; //ASCII2Ansi(s); ListBox1.Items.Text := s; end; |
Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis
danke an euch beide.
Die Funktion ist ja super popov :) Genau das was ich brauche. Kann man in _exeName direkt Parameter für den Exe-Aufruf mit angeben? Müsste laut MSDN der Fall sein. |
Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis
Meine Erfahrungen mit Command Befehlen ist (nicht hier speziell, sondern allgemein), daß man immer schön die Befehle und Parameter trennen sollte. Versuche es, wundere dich aber nicht.
|
Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis
Huch, hab deinen Beispielaufruf übersehen :)
CmdLine ist natürlich der Parameter den ich brauche. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz