С получением вывода из консоли после распаковки ВСЕХ файлов, проблем не возникает (делаю почти всё как в последнем примере – "чтение больших объёмов вывода" – из Lazarus Wiki - http://wiki.lazarus.freepascal.org/Executing_External_Programs/ru).
Код:
- Код: Выделить всё
- max_l:=1024;
 try
 P.CommandLine:=Utf8toSys(7z e file.rar -oC:\tmp -y);
 P.Options := [poUsePipes, poNoConsole];
 P.Execute;
 while P.Running do begin
 if P.output.NumBytesAvailable>0 then begin
 M.SetSize(BytesRead + max_l);
 i := P.Output.Read((M.Memory + BytesRead)^, max_l);
 end else i:=0;
 if i > 0 then begin //это не выполняется
 Inc(BytesRead, i);
 M.SetSize(BytesRead);
 Form1.Mm_main.Lines.Add('...');
 Application.ProcessMessages;
 end
 else Sleep(100);
 end;
 if Form1.Visible=true then Application.ProcessMessages;
 Result :=P.ExitStatus;
 finally
 P.Free;
 M.Free;
Но ВО ВРЕМЯ распаковки ничего получить не могу (NumBytesAvailable = 0). В чём может быть проблема?
Сейчас для демонстрации процесса распаковки приходится запускать на таймере проверку количества файлов в директории, куда распаковываются файлы. До этого получаю от 7zip количество файлов в архиве (команда 7z l archive.zip). Выглядит как-то не красиво поэтому решил попробовать по-другому, но не выходит...



