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 a "Data\UpdateList.zip" "UpdateList*"
  2. フォルダの内容のみをアーカイブします。
    • 7z.exe a "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 に答える