![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как дождаться окончание работы вызываемого приложения ? [D6, WinXP]
Som © (2005-09-02 15:17:00)Необходимо запустить приложение, дождаться его выполнения и после выполнить определённые действия. Вопрос именно в том, как дождаться оканчание работы приложения?
Eraser (2005-09-02 17:59:00) [1]Gydvin © (02.09.05 15:39) [5]
под win32 лучше так не делать.
Som (2005-09-02 17:27:00) [2]спасибо всем, всё получилось
begin...end (2005-09-02 16:06:00) [3]> Fay © (02.09.05 16:02) [8]
Зачем?
Fay (2005-09-02 16:02:00) [4]2 Хинт © (02.09.05 15:44) [7]
>CloseHandle( pi.hProcess );
> CloseHandle( pi.hThread );
Думаю, стоит поменять порядок 8)
Хинт (2005-09-02 15:44:00) [5]var
si:STARTUPINFO;
pi:PROCESS_INFORMATION;
...
begin
ZeroMemory(@si,sizeof(si));
si.cb:=SizeOf(si);
cmdline:='C:\my.exe';
if not CreateProcess( nil, PChar(cmdline), nil, nil, False, 0, nil, nil, si, pi) then ...
WaitForSingleObject( pi.hProcess, INFINITE );
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
...
end;
Gydvin (2005-09-02 15:41:00) [6]От него же
Как мне запустить какую-нибудь программу? А как подождать, пока эта программа не отработает? Как выяснить, работает ли программа или уже завершилась? Как принудительно закрыть выполняющуюся программу?
Nomadic рекомендует следующее:
A: WinExec() или ShellExecute. У второй больше возможностей.
(SO): CreateProcess() в параметре process info возвращает handle запущенного процесса. Вот и делаешь WaitForSingleObject(pi.hProcess, INFINITE);
(AA): (Win16) Delay можно взять из rxLib.
--------------------------------------------------------------------------------
handle := WinExec(...);
if handle >= 32 then
while GetModuleUsage(handle) > 0 do
Delay( nn );
else
raise ....
(AM): Чтобы выяснить, работает ли программа, используйте GetProcessTimes(), параметр lpExitTime.
(Win32) Для принудительного завершения процесса -- TerminateProcess.
(Win16) (RR): Надо послать программе сообщение WM_QUIT:
--------------------------------------------------------------------------------
Handle := Winexec(App, 0);
PostMessage(Handle, WM_QUIT, 0, 0);
Gydvin (2005-09-02 15:39:00) [7]От Озерова
Определение окончания работы другого приложения
WinExec сразу после запуска приложения возвращает его дескриптор. Для определения завершения программы вы должны вызывать функцию GetModuleUsage(InstanceID), где InstanceID - дескриптор запущенного функцией WinExec приложения. Если возвращаемый результат содержит ноль, приложение завершило свою работу. Сделайте проверку в таймерном цикле и задача решена.
wal (2005-09-02 15:32:00) [8]
> запускал WinExec-ом,
Хелп по ней читал? Там написано:
This function is provided for compatibility with earlier versions of Windows. For Win32-based applications, use the CreateProcessfunction.
Som (2005-09-02 15:23:00) [9]запускал WinExec-ом, но он же не ждёт окончания работы приложения
wal (2005-09-02 15:19:00) [10]
> Вопрос именно в том, как дождаться оканчание работы приложения?
Для начала, вопрос в том, как запускаешь?
С уважением.
begin...end (2005-09-02 15:19:00) [11]CreateProcess + WaitForSingleObject