3

当我从命令行运行它时:

7z a 1.zip J:\test.mp4

我可以看到完成了多少百分比。当我尝试使用 CreateProcess 和 CreatePipe 从 Delphi 运行它时,在文件被打包之前我什么也没得到。然后它显示了 7zip 的最终输出。

我的代码如下所示:

Stream:= THandleStream.Create(hRead);
try
  if not CreateProcess(nil, PChar(Cmd), nil, nil, 
                       True, 0, nil, nil, StartupInfo, 
                       ProcessInformation) then
    RaiseLastOSError;
  repeat
    if not GetExitCodeProcess(ProcessInformation.hProcess, ExitCode) then
      RaiseLastOSError;

    while Stream.Position < Stream.Size do 
    begin
      Stream.Read(C, 1);

      if (C = #13) then 
      begin
        Memo1.Lines.Add(S);
        S := '';
        Application.ProcessMessages;
      end
      else if C <> #10 then 
      begin
        S := S+C;
      end;
    end;
  until ExitCode <> Still_Active;
finally
  Stream.Free;
end;

我不想只创建一个 ZIP 存档——我知道在 Delphi 中有更好的方法来做到这一点。我想与控制台应用程序交互。许多控制台应用程序的输出可以使用我发布的代码进行处理,但是使用 7zip 会失败——这就是我在这里询问 7zip 的原因。7zip 有什么特别之处以至于它的输出无法正确捕获?如何从像 7zip 这样的应用程序中捕获输出?

4

2 回答 2

5

你可以看看progdigy制作的插件

进度条

 function ProgressCallback(sender: Pointer; total: boolean; value: int64): HRESULT; stdcall;
 begin
   if total then
     Mainform.ProgressBar.Max := value else
     Mainform.ProgressBar.Position := value;
   Result := S_OK;
 end;

 procedure TMainForm.ExtractClick(Sender: TObject);
 begin
   with CreateInArchive(CLSID_CFormatZip) do
   begin
     OpenFile('c:\test.zip');
     SetProgressCallback(nil, ProgressCallback);
     ...
   end;
 end;
于 2012-05-19T06:54:43.170 回答
-1

命令:

  1. 归档包含内容的文件夹。
    • 7z.exe "Data\UpdateList.zip" "UpdateList*"
  2. 仅存档文件夹的内容。
    • 7z.exe "Data\UpdateList.zip" ".\UpdateList*"

WinApi:

  1. CreateProcessWithComLine_Wait(30000, L"C:\MyExcample\", NULL, L"7z.exe a \"Data\UpdateList.zip\" \".\UpdateList*\" ");


    DWORD static CreateProcessWithComLine_Wait(const DWORD dwWait, const PWCHAR szFolderPath, const PWCHAR szFilePath, const PWCHAR szComLine)
    {
    DWORD result    = 0;
    // ----
    STARTUPINFO si;
    ZeroMemory( & si, sizeof(si));
    // ----
    PROCESS_INFORMATION pi;
    ZeroMemory( & pi, sizeof(pi));
    // ----
    si.cb                   = sizeof(si);
    si.wShowWindow          = SW_HIDE;
    // ----
    DWORD dwErrorCode = 0;
    // ----
    int iRes    = CreateProcess(szFilePath, szComLine, NULL, NULL, FALSE,
    NORMAL_PRIORITY_CLASS, NULL, szFolderPath, &si, &pi);
    if ( iRes != 0 )
    {
    WaitForSingleObject(pi.hProcess, dwWait);
    // ----
    CloseHandle(pi.hThread);
    CloseHandle(pi.hProcess);
    }
    else
    {
    dwErrorCode = GetLastError();
    result = dwErrorCode;
    }
    // ----
    return result;
    }


于 2018-07-20T14:43:24.617 回答