Opet ja sa mojim problemima. Ovaj put pokusavam da uhvatim poruke koje mi ispisuje aplikacija u konzoli i da doticne vratim u recimo Memo komponentu. Problem je sto je program koji se izvrsava u konzoli ustvari linux program kompajliran na Cygwinu. Neke rezultate sam vec ostvario, tj. kada konsolni program odradi svoje ja dobijem poruke koje je ispisao na ekranu u mojoj Memo komponenti (za to vreme se konzola ne vidi). Medjutim, poruke dobijem tek na kraju, sve odjednom, a ne periodicno kako se one ustvari pojavljuju na ekranu.
Evo koda koji sam koristio:
procedure TConsoleForm.RunCaptured(DosApp : string;AMemo : TMemo);
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;
begin
with Security do
begin
nlength := SizeOf(TSecurityAttributes);
binherithandle := true;
lpsecuritydescriptor := nil;
end;
if CreatePipe (ReadPipe, WritePipe, @Security, 0) then
begin
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;
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
Inc(n,1);
Apprunning := WaitForSingleObject(ProcessInfo.hProcess,100);
Application.ProcessMessages;
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) ;
Buffer[TotalBytesRead]:= #0;
OemToChar(Buffer,Buffer);
AMemo.Text := AMemo.text + StrPas(Buffer);
end;
FreeMem(Buffer);
CloseHandle(ProcessInfo.hProcess);
CloseHandle(ProcessInfo.hThread);
CloseHandle(ReadPipe);
CloseHandle(WritePipe);
end;
Memo1.Text := AnsiReplaceStr(Memo1.Text, chr(10), (chr(13) + chr(10)));
end;
end.
Zadnja linija mi pretvara Linuxov kraj linije u Windowsow (CR > CR/LF).
Jel moze neko da mi pomogne da nateram ovo cudo da mi pokazuje poruke onda kada se pojave a ne tek na kraju?
Mislim da je problem bas u CR <=> CR/LF razlici.
|