Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Как запустить приложение и подождать пока оно отработает 5

Delphi , Программа и Интерфейс , Приложения чужие

Как запустить приложение и подождать пока оно отработает 5

Автор: Robor

Запускаю с помощью CreateProcess процесс архивирования, как узнать, что он завершился, чтобы перекопировать файл на дискету?


Unit exec;

interface

Uses Windows, SysUtils, Forms, ShellAPI;

function ExecWin(Path,name,CommandLine,CurrentDir:string;Wait:boolean) : word;

implementation

function ExecWin(Path,name,CommandLine,CurrentDir:string;Wait:boolean) : word;
var
 tsi           : TStartupInfo;
 tpi           : TProcessInformation;
 tPath,Command : PChar;
 CurDir        :Pchar;
//  st1           :string;
//  T1,T2,T3,T4   :TFileTime;
//  rr            :boolean;
 cod           :DWord;

//  ErrorMessage: Pointer;  
//  ErrorCode: DWORD;           // holds a system error code
begin
 Result := 30;
 Path:=path+name+' '+CommandLine+#00;
 CommandLine:=CommandLine+#0;
 tPath   := StrAlloc(512);
 Command := StrAlloc(512);
 CurDir  :=StrAlloc(512);

 FillChar(tsi, SizeOf(TStartupInfo), 0);
 tsi.cb := SizeOf(TStartupInfo);
 tsi.dwFlags := STARTF_USESHOWWINDOW;
 tsi.wShowWindow := SW_SHOWMINNOACTIVE;
//  FindExecutable(@Path[1],nil,tPath);
//  st1:=string(tPath)+#0;
//  st1:=AnsiUpperCase(st1);
//  Path:=AnsiUpperCase(Path);
//  if st1< > Path then st1:=Concat(st1,' ',path,#0);
//  Move(st1[1],tPath[0],Length(st1));
//  Move(CommandLine[1],Command[0],length(CommandLine));
 Move(Path[1],tPath[0],Length(Path));
 CurrentDir:=CurrentDir+#0;
 Move(CurrentDir[1],CurDir[0],length(CurrentDir));
 try
   if CreateProcess(nil,@tPath[0]{, @Command[0]},nil, nil, False,
   CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS,nil, @CurDir[0], tsi, tpi)
    then begin
      cod:=WAIT_TIMEOUT;
      while (cod=WAIT_TIMEOUT) and Wait do begin
        cod:=WaitForSingleObject(tpi.hProcess, 500);
        Application.ProcessMessages;
      end;
      result:=0;
{       rr:=GetProcessTimes(tpi.hProcess,t1,t2,t3,t4);
      while (t2.dwLowDateTime=0) and (t2.dwHighDateTime=0) and rr do begin
       Application.ProcessMessages;
       rr:=GetProcessTimes(tpi.hProcess,t1,t2,t3,t4);
      end;}
      CloseHandle(tpi.hProcess);
      CloseHandle(tpi.hThread);
    end
    else result:=GetLastError;
 finally
{  ErrorCode := GetLastError;
 FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER or FORMAT_MESSAGE_FROM_SYSTEM,
               nil, ErrorCode, 0, @ErrorMessage, 0, nil);
 LocalFree(hlocal(ErrorMessage));}
 StrDispose(Command);
 StrDispose(tPath);
 StrDispose(CurDir);
 end;
end;

end.

Приведенный код - функция Delphi ExecWin, которая запускает исполняемый файл с помощью Windows API-функции CreateProcess и ожидает его завершения выполнения.

Вот пример использования этой функции:

procedure RunExecutable;
var
  Path, Name, CommandLine, CurrentDir: string;
begin
  Path := 'C:\Путь\К\Вашему\Исполняемому\Файлу.exe'; // Замените на путь к вашему исполняемому файлу
  Name := 'ВашИсполняемый';
  CommandLine := '/аргумент1 /аргумент2'; // Опциональные аргументы командной строки
  CurrentDir := 'C:\Текущая\Папка'; // Папка, где находится исполняемый файл

  if ExecWin(Path, Name, CommandLine, CurrentDir, True) <> 0 then
    ShowMessage('Ошибка запуска исполняемого файла: ' + SysErrorMessage(ExecWin(Path, Name, CommandLine, CurrentDir, True), False))
  else
    ShowMessage('Исполняемый файл запущен успешно');
end;

Чтобы узнать, когда процесс завершил выполнение, вы можете проверить возвращаемое значение функции WaitForSingleObject. Она возвращает значение, указывающее, находится ли объект в состоянии сигнала или нет.

В вашем случае вы можете модифицировать код следующим образом:

cod := WAIT_TIMEOUT;
while (cod = WAIT_TIMEOUT) and Wait do begin
  cod := WaitForSingleObject(tpi.hProcess, 500);
end;

if cod = WAIT_OBJECT_0 then // Процесс завершил выполнение
  ShowMessage('Исполняемый файл запущен успешно');
else
  ShowMessage('Ошибка запуска исполняемого файла: ' + SysErrorMessage(GetLastError, False));

Код будет ожидать 5 секунд (500 миллисекунд) или до тех пор, пока процесс не завершит выполнение. Если процесс завершит выполнение в течение этих 5 секунд, он отобразит сообщение "Исполняемый файл запущен успешно". В противном случае он отобразит ошибочное сообщение с системным кодом ошибки.

Как запустить приложение и подождать пока оно отработает 5 секунд, для этого можно использовать функцию ExecWin из Delphi, которая позволяет запускать приложения с указанием командной строки и времени ожидания завершения выполнения.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Приложения чужие ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 17:12:46/0.0026240348815918/0