Конференция "WinAPI" » Дождаться завершения выполнения процесса [D5, WinXP]
 
  • harisma (09.06.08 16:09) [0]
    Здравствуйте. В программе по кнопке создается некий внешний процесс используя API функцию CreateProcess. Все работало нормально, но возникла необходимость теперь запустив процесс на выполнение, ДОЖДАТЬСЯ ЕГО ЗАВЕРШЕНИЯ, переведя программу в ждущий режим. Каким образом программа может узнать, что запущенный внешний процесс завершился?
    Спасибо.
  • Поросенок Винни-Пух © (09.06.08 16:11) [1]
    вэйтфорсинглеобжект энд компания
  • harisma (09.06.08 16:36) [2]
    Thanks
  • Тын-Дын © (09.06.08 21:21) [3]

    > harisma   (09.06.08 16:36) [2]


    Если с нерусского из [1] перевести на нормальный, то получим пример:

    function ExecCmd(const aCommand: String;const aShow, aWaitExit: Boolean): Boolean;
    var
     pi:PROCESS_INFORMATION;
     si:STARTUPINFO;
     cmdLine,Path: String;
    begin
     ZeroMemory(@si,sizeof(si));
     si.cb:=SizeOf(si);
     si.dwFlags := STARTF_FORCEONFEEDBACK+STARTF_USESHOWWINDOW;
     if aShow then si.wShowWindow := SW_SHOWNORMAL else si.wShowWindow := SW_HIDE;
     Path := ExtractFilePath(aCommand);
     cmdLine := aCommand;
     Result :=
            CreateProcess( nil,
                           PChar(cmdLine),
                           nil,
                           nil,
                           False,
                           0,
                           nil,
                           PChar(Path),
                           si,
                           pi );
     if Result then
     begin
       CloseHandle(Info^.pi.hThread);
       if aWaitExit then WaitForSingleObject( pi.hProcess, infinite );
       CloseHandle(Info^.pi.hProcess);
     end;
    end;

  • Германн © (10.06.08 01:47) [4]

    > Тын-Дын ©   (09.06.08 21:21) [3]

    Не ты ли жалился про трудности в поиске по местному ФАКу?
    http://delphimaster.ru/cgi-bin/search.pl?words=CreateProcess&n=101
    Вторая ссылка содержит твой ответ.
    Кстати более грамотный.чем твой. Чуть-чуть более, но всё-таки более!
  • Тын-Дын © (10.06.08 10:35) [5]
    я бы сказал - по ссылке немного менее грамотный ответ. Да еще и с неочевидной ошибкой.
  • Поросенок Винни-Пух © (10.06.08 11:03) [6]
    Да еще и с неочевидной ошибкой.

    А жирное в твоем коде это что?

    CloseHandle(Info^.pi.hThread);
  • Игорь Шевченко © (10.06.08 11:11) [7]
    Как лучше сделать, если необходимо запустить внешний процесс и подождать, пока он отработает?

    А я так делаю:

    function RunAndWait (const ExeName, ParamString: string;
     QuoteParams: Boolean = true): Integer;
    var
     ShellInfo: TShellExecuteInfo;
     ExitCode: DWORD;
    begin
     ShellInfo.cbSize := SizeOf(ShellInfo);
     ShellInfo.fMask := SEE_MASK_NOCLOSEPROCESS;
     ShellInfo.Wnd := HWND_DESKTOP;
     ShellInfo.lpVerb := 'open';
     ShellInfo.lpFile := PChar(ExeName);
     if QuoteParams then
       ShellInfo.lpParameters := PChar('\"'+ParamString+'\"')
     else
       ShellInfo.lpParameters := PChar(ParamString);
     ShellInfo.lpDirectory := PChar(ExtractFilePath(ExeName));
     ShellInfo.nShow := SW_HIDE;
     if not ShellExecuteEx(@ShellInfo) then
       RaiseLastOSError;
     if ShellInfo.hProcess <> 0 then
       try
         WaitForSingleObjectEx(ShellInfo.hProcess, INFINITE, false);
         GetExitCodeProcess(ShellInfo.hProcess, ExitCode);
         Result := ExitCode;
       finally
         CloseHandle(ShellInfo.hProcess);
       end
     else
       Result := -1;
    end;

  • Тын-Дын © (10.06.08 14:20) [8]

    > А жирное в твоем коде это что?
    >
    > CloseHandle(Info^.pi.hThread);

    Опечатка. От прежнего проекта осталась.
 
Конференция "WinAPI" » Дождаться завершения выполнения процесса [D5, WinXP]
Есть новые Нет новых   [134433   +22][b:0][p:0.002]