Registriert seit: 8. Sep 2005
Ort: Neuendeich, Lübeck
277 Beiträge
Turbo Delphi für Win32
|
Ausgabe einer Konsolenanwendung abfangen (simple Fassung)
24. Aug 2008, 17:05
Moin moin,
mithilfe von Jens Code und diesem Delphi-Treff Tipp habe ich eine kleine Funktion geschrieben, die eine Konsolenanwendung startet, auf deren Ende wartet und die Ausgabe als String zurückliefert:
Delphi-Quellcode:
function Konsole(const Command: String): String;
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
SecurityAttr: TSecurityAttributes;
OutputPipeRead, OutputPipeWrite: THandle;
Res: Boolean;
BufSize: Cardinal;
Buffer: String;
BytesRead: Cardinal;
begin
//Initialisierung ProcessInfo
FillChar(ProcessInfo, SizeOf(TProcessInformation), 0);
//Initialisierung SecurityAttr
FillChar(SecurityAttr, SizeOf(TSecurityAttributes), 0);
SecurityAttr.nLength := SizeOf(SecurityAttr);
SecurityAttr.bInheritHandle := true;
SecurityAttr.lpSecurityDescriptor := nil;
//Pipe erzeugen
CreatePipe(OutputPipeRead, OutputPipeWrite, @SecurityAttr, 0);
//Initialisierung StartupInfo
FillChar(StartupInfo, SizeOf(TStartupInfo), 0);
StartupInfo.cb:=SizeOf(StartupInfo);
StartupInfo.hStdInput := 0;
StartupInfo.hStdOutput := OutputPipeWrite;
StartupInfo.hStdError := OutputPipeWrite;
StartupInfo.wShowWindow := SW_HIDE;
StartupInfo.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
//Prozess erzeugen
Res := CreateProcess(nil, PChar(command), nil, nil, true,
CREATE_DEFAULT_ERROR_MODE or CREATE_NEW_CONSOLE or
NORMAL_PRIORITY_CLASS, nil, nil, StartupInfo, ProcessInfo);
//OutputPipeWrite schließen
CloseHandle(OutputPipeWrite);
Result := '';
if Res then
begin
//OutputPipeRead auslesen
SetLength(Buffer, 5000);
BufSize := Length(Buffer);
repeat
Res := ReadFile(OutputPipeRead, Buffer[1], BufSize, BytesRead, nil);
Result := Result + Copy(Buffer, 1, BytesRead);
until not Res;
//auf Prozessende warten
WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
CloseHandle(ProcessInfo.hProcess);
end;
//OutputPipeRead schließen
CloseHandle(OutputPipeRead);
end;
Aufruf-Beispiel:
ShowMessage(Konsole('cmd /c dir C:\'));
Grüße
Malte
Malte Schmitz Der Unterschied zwischen Theorie und Praxis ist in der Praxis größer als in der Theorie.
Entwickler des HTML-Editors MEdit ( DP)
|
|
Zitat
|