Omschrijving
Deze functie voert een DOS programma uit (of beter/officiëler gezegd: een console applicatie ) en geeft de output van dit programma als string terug.
Opmerkingen
http://www.nldelphi.com/Forum/showth...?threadid=4318
De functie is enigzins aangepast. Onnodige code is verwijderd, en StdError wordt ook in de gaten gehouden, aangezien sommige programma's daar naar schrijven (heb hier praktijkervaring mee, kon met de originele code de output van sommige C programma's niet capturen, eigenwijze grmbl programma's).
Code
Code:
function CaptureConsoleOutput(const ACommand: String): String;
const
CReadBuffer = 2400;
var
saSecurity: TSecurityAttributes;
hRead: THandle;
hWrite: THandle;
suiStartup: TStartupInfo;
piProcess: TProcessInformation;
pBuffer: array[0..CReadBuffer] of Char;
dRead: DWord;
dRunning: DWord;
begin
Result := '';
with saSecurity do begin
nLength := SizeOf(TSecurityAttributes);
bInheritHandle := True;
lpSecurityDescriptor := nil;
end;
if CreatePipe(hRead, hWrite, @saSecurity, 0) then begin
FillChar(suiStartup, SizeOf(TStartupInfo), #0);
with suiStartup do begin
cb := SizeOf(TStartupInfo);
hStdInput := hRead;
hStdOutput := hWrite;
hStdError := hWrite;
dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW;
wShowWindow := SW_HIDE;
if CreateProcess(nil, PChar(ACommand), @saSecurity, @saSecurity, True,
NORMAL_PRIORITY_CLASS, nil, nil, suiStartup,
piProcess) then begin
repeat
dRunning := WaitForSingleObject(piProcess.hProcess, 100);
Application.ProcessMessages();
repeat
dRead := 0;
ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil);
pBuffer[dRead] := #0;
OemToAnsi(pBuffer, pBuffer);
Result := Result + String(pBuffer);
until (dRead < CReadBuffer);
until (dRunning <> WAIT_TIMEOUT);
CloseHandle(piProcess.hProcess);
CloseHandle(piProcess.hThread);
end;
CloseHandle(hRead);
CloseHandle(hWrite);
end;
end;
end;
Bookmarks