Если мы сами запускаем приложение, то легче всего сделать так:
| Код | procedure ExecAndWait; var StartInfo : TStartupInfo; ProcInfo : TProcessInformation; CreateOK : Boolean; begin FillChar(StartInfo,SizeOf(TStartupInfo),#0); FillChar(ProcInfo,SizeOf(TProcessInformation),#0); StartInfo.cb := SizeOf(TStartupInfo); CreateOK := CreateProcess('наше приложение',nil, nil, nil,False, CREATE_NEW_PROCESS_GROUP+NORMAL_PRIORITY_CLASS, nil, nil, StartInfo, ProcInfo); if CreateOK then begin WaitForSingleObject(ProcInfo.hProcess, INFINITE); MessageBox(0,'Процесс завершился','',0); end; end;
...
var a:cardinal; begin CreateThread(nil,0,@ExecAndWait,nil,0,a); end;
|
Если не сами, то:
| Код |
uses TlHelp32;
function GetProcessId(pName: PChar): dword; var Snap: dword; Process: TPROCESSENTRY32; begin Result := 0; Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if Snap <> INVALID_HANDLE_VALUE then begin Process.dwSize := SizeOf(TPROCESSENTRY32); if Process32First(Snap, Process) then repeat if lstrcmpi(Process.szExeFile, pName) = 0 then begin Result := Process.th32ProcessID; CloseHandle(Snap); Exit; end; until not Process32Next(Snap, Process); Result := 0; CloseHandle(Snap); end; end;
procedure OpenAndWait; var h:THandle; begin h := OpenProcess(PROCESS_ALL_ACCESS, False, GetProcessId('наше прилодение')); if h<>0 then begin WaitForSingleObject(h, INFINITE); MessageBox(0,'Процесс завершился','',0); end else MessageBox(0,'Возможно процесс не запущен','',0); end;
...
var a:cardinal; begin CreateThread(nil,0,@OpenAndWait,nil,0,a); end;
|
Чтобы наше приложение (если оно оконное) не "зависло", убираем запуск и ожидание в отдельный поток. Да ещё я не понял, что не так с таймером? |