(Gast)
n/a Beiträge
|
Re: Kommandozeilen-Programm ausführen, dessen Ausgabe in Lis
29. Jun 2009, 11:07
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;
|
|
Zitat
|