F.eks. kunne du gøre sådan her:
function GetOutputFromConsole(Cmd: String; TimeOut: Integer = 30): string;
var
Security: TSecurityAttributes; // Security
StartUp: TStartupInfo; // Startup parametre
Process: TProcessInformation; // Process information
StdRead, StdWrite: THandle; // I/O handles
OK: Boolean; // Bruges til at holde øge med om noget er OK :P
Buf: array [0..255] of Char; // En buffer på 256 tegn
BR: Cardinal; // BR = Bytes Read
Text: String; // Denne holder den tekst konsollen giver som output
begin
Application.ProcessMessages;
// Sætter Security op:
Security.nLength := SizeOf(Security);
Security.lpSecurityDescriptor := nil;
Security.bInheritHandle := True;
// Creater en pipe, så vi kan læse fra konsollen!
CreatePipe(StdRead, StdWrite, @Security, 0);
try
// Sætter Startup flags op... Deriblandt at vi ikke vil se konsollen!
FillChar(Startup, SizeOf(Startup), 0);
Startup.cb := SizeOf(Startup);
Startup.dwFlags := STARTF_USESHOWWINDOW or STARTF_USESTDHANDLES;
Startup.wShowWindow := SW_HIDE;
Startup.hStdInput := GetStdHandle(STD_INPUT_HANDLE);
Startup.hStdOutput := StdWrite;
Startup.hStdError := StdWrite;
// Sætter OK til om det lykkedes at starte programmet
OK := CreateProcess(nil, PChar(Cmd), nil, nil, True, 0, nil, nil, Startup, Process);
// Lukker StdWrite handlet!
CloseHandle(StdWrite);
// Hvis programmet ikke blev startet, så under retter vi brugeren med en Exception!
if not OK then
raise Exception.Create('Kunne ikke udføre kommandoen!')
else // Hvis det derimoed blev startet så gør vi flg.:
try
// Sætter Text til <Intet>
Text := '';
// Starter en lykke!
repeat
// Sætter OK til om det lykkedes at læse fra StdRead handlet!
OK := ReadFile(StdRead, Buf, 255, BR, nil);
// Hvis BR er større end 0, så...
if BR > 0 then begin
// Sætter vi Bufferen's [BR] til #0(ASCII kode nul!)
Buf[BR] := #0;
// Og ligger Bufferen til Text
Text := Text + Buf;
end;
// ... indtil...
until
// OK er false eller BR er 0
not OK or (BR = 0);
// Venter på at processen bliver færdig! Hvis den ikke bliver færdig inden <TimeOut> så kører vi videre bagefter!
WaitForSingleObject(Process.hProcess, TimeOut*1000);
finally
// Lukker processens tråd!
CloseHandle(Process.hThread);
// Lukker selve processen
CloseHandle(Process.hProcess);
end;
finally
// Vi sender Text tilbage til calleren som et resultat
Result := Text;
// Og her til sidst lukker vi vores StdRead handle!
CloseHandle(StdRead);
end;
end;
Denne kaldes så med GetOutputFromConsole("<konsol-programmet>"[, <Maksimum tid programmet må køre - Standard 30 sekunder>]); (Hvor det imellem [ og ] er en optional parameter!)
MH.
The-Freak
Livet er for kort til at kede sig.