One note to my self, this is piece of code which I was using for starting application from command prompt and getting an information, was that succesfull or not.
function CaptureConsoleOutput(DosApp : string; var strLog : String): Boolean;
const
ReadBuffer = 1048576;ĂÂ // 1 MB Buffer
var
Security: TSecurityAttributes;
ReadPipe,WritePipe: THandle;
start: TStartUpInfo;
ProcessInfo: TProcessInformation;
Buffer: Pchar;
TotalBytesRead,
BytesRead: DWORD;
Apprunning,n,
BytesLeftThisMessage,
TotalBytesAvail : integer;
xCode: Cardinal;
bolOk: Boolean;
begin
bolOk := False;
with Security do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if CreatePipe (ReadPipe, WritePipe, @Security, 0) then
begin
// Redirect In- and Output through STARTUPINFO structure
Buffer := AllocMem(ReadBuffer + 1);
FillChar(Start,Sizeof(Start),#0);
start.cb := SizeOf(start);
start.hStdOutput := WritePipe;
start.hStdInput := ReadPipe;
start.dwFlags := STARTF_USESTDHANDLES + STARTF_USESHOWWINDOW;
start.wShowWindow := SW_HIDE;
start.hStdError := WritePipe;
// Create a Console Child Process with redirected input and output
if CreateProcess(nil, PChar(DosApp),
@Security,@Security,
true, CREATE_NO_WINDOW or NORMAL_PRIORITY_CLASS,
nil, nil,
start, ProcessInfo) then
begin
n:=0;
TotalBytesRead:=0;
repeat
// Increase counter to prevent an endless loop if the process is dead
Inc(n,1);
// wait for end of child process
Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100);
Application.ProcessMessages;
// it is important to read from time to time the output information
// so that the pipe is not blocked by an overflow. New information
// can be written from the console app to the pipe only if there is
// enough buffer space.
if not PeekNamedPipe(ReadPipe ,@Buffer[TotalBytesRead],
ReadBuffer, @BytesRead,
@TotalBytesAvail,@BytesLeftThisMessage) then break
else if BytesRead > 0 then
ReadFile(ReadPipe,Buffer[TotalBytesRead],BytesRead,BytesRead,nil);
TotalBytesRead:=TotalBytesRead+BytesRead;
until (Apprunning <> WAIT_TIMEOUT) or (n > 150);
GetExitCodeProcess(ProcessInfo.hProcess,xCode);
if xCode=0 then
bolOk := True
else
bolOk := False;
Buffer[TotalBytesRead]:= #0;
OemToChar(Buffer,Buffer);
strLog := strLog + StrPas(Buffer);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
Result := bolOk;
end;
end;