|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Дописать функцию, чтобы в ней присутствовало ожидание закрытия процесса
Есть такая функция завершения процесса:
Код:
function KillTask(ExeFileName: string): Integer; const PROCESS_TERMINATE = $0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; begin Result := 0; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while Integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then Result := Integer(TerminateProcess( OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0)); ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; CloseHandle(FSnapshotHandle); end; Нужно дописать её что бы в процедуре присутствовало ожидание закрытия процесса. Помогите пожалуйста. p.s: пытался через "WaitFor..." но ничего не вышло |
#2
|
||||
|
||||
Цитата:
Код:
while WaitforSingleObject(FSnapshotHandle, 200) = WAIT_TIMEOUT do Application.ProcessMessages; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#3
|
|||
|
|||
У меня консольное приложение.
|
#4
|
|||
|
|||
Ожидание завершения проверяю так:
Код:
KillTask('notepad++.exe'); ShowMessage(IntToStr(GetProcID('notepad++.exe'))); Суть такова: если не будет процесса то ShowMessage выдаст PID 0. |
#5
|
|||
|
|||
Вот так доделал функцию:
Код:
function KillTask(ExeFileName : string; PIDproc : Integer): Integer; const PROCESS_TERMINATE = $0001; var ContinueLoop: BOOL; FSnapshotHandle: THandle; FProcessEntry32: TProcessEntry32; prc : THandle; begin Result := 0; FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); FProcessEntry32.dwSize := SizeOf(FProcessEntry32); ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32); while Integer(ContinueLoop) <> 0 do begin if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) = UpperCase(ExeFileName)) or (UpperCase(FProcessEntry32.szExeFile) = UpperCase(ExeFileName))) then Result := Integer(TerminateProcess( OpenProcess(PROCESS_TERMINATE, BOOL(0), FProcessEntry32.th32ProcessID), 0)); ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32); end; prc := OpenProcess(PROCESS_ALL_ACCESS, false, PIDproc); WaitforSingleObject(prc, INFINITE); CloseHandle(FSnapshotHandle); end; Использовать так: Код:
KillTask('notepad++.exe', GetProcID('notepad++.exe')); Может кто подскажет как можно оптимизировать? |