| 
| 
 | Вопрос # 4 726/ вопрос открыт / | 
 |  Приветствую, уважаемые эксперты!В программку в качестве ресурса поместил архиватор 7-Zip Command line version. В общем это один файл "7z.exe".
 При работе в программе я извлекаю из ресурса архиватор в темповою папку и сохраняю туда файл данных. Затем данные архивируются, я это делаю так: WinExec(PAnsiChar('c:\7z.exe a -sfx -pprm c:\1.bin c:\1.txt'), SW_HIDE );
 НО как можно программно определить, что процесс архивации завершился чтобы я мог что-то еще делать с файлом?
 
|  |   Вопрос задал: Roman Novikov (статус: Посетитель)Вопрос отправлен: 13 ноября 2010, 10:17
 Состояние вопроса: открыт, ответов: 1.
 |  Ответ #1. Отвечает эксперт: min@y™ Ну, к примеру, в пакете модулей Delphi Works есть такая процедура:
 procedure dwExecAndWait(const FileName, Params: String; const CmdShow: Integer);
var
  exInfo: TShellExecuteInfo;
  Ph: DWORD;
begin
  FillChar(exInfo, SizeOf(exInfo), 0);
  with exInfo do
  begin
    cbSize := SizeOf(exInfo);
    fMask := SEE_MASK_NOCLOSEPROCESS or SEE_MASK_FLAG_DDEWAIT;
    Wnd := GetActiveWindow();
    ExInfo.lpVerb := 'open';
    ExInfo.lpParameters := PChar(Params);
    lpFile := PChar(FileName);
    nShow := CmdShow;
  end;
  if ShellExecuteEx(@exInfo) then
    Ph := exInfo.HProcess
  else
  begin
    ShowMessage(SysErrorMessage(GetLastError));
    Exit;
  end;
  while WaitForSingleObject(ExInfo.hProcess, 50) <> WAIT_OBJECT_0 do
    dwProcessMessages;
  CloseHandle(Ph);
end;Подойдёт?
|  | Ответ отправил: min@y™ (статус: Доктор наук)Время отправки: 13 ноября 2010, 10:25
 Оценка за ответ: 5
 Комментарий к оценке: Спасибо большое! |  
 Мини-форум вопросаВсего сообщений: 2; последнее сообщение — 19 ноября 2010, 16:46; участников в обсуждении: 1. 
|   | Roman Novikov (статус: Посетитель), 19 ноября 2010, 15:02 [#1]:Вот еще наiел: 
 
 function FileExecuteWait(const FileName, Params, StartDir: string; InitialState: TExecState): Integer;
var
    Info: TShellExecuteInfo;
    ExitCode: DWORD;
begin
    FillChar(Info, SizeOf(Info), 0);
    Info.cbSize := SizeOf(TShellExecuteInfo);
    with Info do begin
        fMask := SEE_MASK_NOCLOSEPROCESS;
        Wnd := Application.Handle;
        lpFile := PChar(FileName);
        lpParameters := PChar(Params);
        lpDirectory := PChar(StartDir);
        nShow := ShowCommands[InitialState];
    end;
    if ShellExecuteEx(@Info) then
    begin
        repeat
            Application.ProcessMessages;
            GetExitCodeProcess(Info.hProcess, ExitCode);
        until (ExitCode <> STILL_ACTIVE) or Application.Terminated;
        Result := ExitCode;
    end
    else
        Result := -1;
end; |  
|   | Roman Novikov (статус: Посетитель), 19 ноября 2010, 16:46 [#2]:Не воспринимает пути и имена файлов с пробелами, подскажите что делать. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |