Šta je novo?

Hvatanje outputa konzolnog programa

voodoo_

Čuven
Učlanjen(a)
31.08.2003
Poruke
9,710
Poena
920
Imam neku proceduru za Delphi koju sam jos davno skinuo sa torry.net a koja izlaz konzolnog programa hvata u TMemo. Medjutim, ova procedura ne radi kako treba pod XP-om (to jest, ne radi uopste), pa bih molio za savet/preporuku jer mi je ovako nesto potrebno za jedan shell koji razvijam.

Hvala.
 
Mislim da je upravo ovo bila ta procedura koju sam imao...
U svakom slucaju zahvaljujem.
 
Voodoo_NBGD je napisao(la):
Mislim da je upravo ovo bila ta procedura koju sam imao...
U svakom slucaju zahvaljujem.

Update:
Nasao sam negde da se procedura 'hvatanja' razlikuje za programe koji koriste low-level i high-level rutine za IO preko konzole... ovo preko pajpova je za high-level, i za neke programe hoce, a za neke nece (recimo, LameMP3 nece).
 
Imam ja ovo shto ti treba ali u c-u preko win32 api , Koristio sam koliko se secam CreateProcess preko pajpova cini mi se.
Ako ti treba mogu da potrazim na hardu.
 
Ma to je to sto imam, samo prevedeno na Paskal.

Kod:
procedure RunDosInMemo(DosApp:String; AMemo:TMemo);
const
  ReadBuffer = 2400;
var
  Security: TSecurityAttributes;
  ReadPipe, WritePipe: THandle;
  start: TStartUpInfo;
  ProcessInfo: TProcessInformation;
  Buffer: PChar;
  BytesRead: DWord;
  Apprunning: DWord;
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, NORMAL_PRIORITY_CLASS, nil, nil, start, ProcessInfo) then
    begin
      repeat
        Apprunning := WaitForSingleObject(ProcessInfo.hProcess, 100);
        Application.ProcessMessages;
      until (Apprunning <> WAIT_TIMEOUT);
      repeat
        BytesRead := 0;
        ReadFile(ReadPipe,Buffer[0], ReadBuffer, BytesRead, nil);
        Buffer[BytesRead] := #0;
        OemToAnsi(Buffer, Buffer);
        AMemo.Text := AMemo.text + String(Buffer);
      until (BytesRead < ReadBuffer);
    end;
    FreeMem(Buffer);
    CloseHandle(ProcessInfo.hProcess);
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ReadPipe);
    CloseHandle(WritePipe);
  end;
end;
 
Ne pravim frontend za lame, lame mi je posluzio cisto kao primer.
Inace, pravim frontend za cdrdao, to jest program za rezanje...
 
Nazad
Vrh Dno