Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.07.2014, 13:11
EEjester EEjester вне форума
Прохожий
 
Регистрация: 03.07.2014
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
Печаль Дописать функцию, чтобы в ней присутствовало ожидание закрытия процесса

Есть такая функция завершения процесса:

Код:
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  
Старый 03.07.2014, 15:31
Аватар для Alegun
Alegun Alegun вне форума
LMD-DML
 
Регистрация: 12.07.2009
Адрес: Богородское
Сообщения: 3,025
Версия Delphi: D7E
Репутация: 1834
По умолчанию

Цитата:
Сообщение от EEjester
p.s: пытался через "WaitFor..." но ничего не вышло
Наверное "...но ничего не вышло" следует понимать как то что при вызове WaitForSingleObject сборка становится мёртвовисячей? Попробуйте её ещё разок вот так задействовать
Код:
while WaitforSingleObject(FSnapshotHandle, 200) = WAIT_TIMEOUT do
 Application.ProcessMessages;
Ответить с цитированием
  #3  
Старый 04.07.2014, 11:10
EEjester EEjester вне форума
Прохожий
 
Регистрация: 03.07.2014
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

У меня консольное приложение.
Ответить с цитированием
  #4  
Старый 04.07.2014, 11:50
EEjester EEjester вне форума
Прохожий
 
Регистрация: 03.07.2014
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Ожидание завершения проверяю так:

Код:
KillTask('notepad++.exe');
ShowMessage(IntToStr(GetProcID('notepad++.exe')));

Суть такова: если не будет процесса то ShowMessage выдаст PID 0.
Ответить с цитированием
  #5  
Старый 04.07.2014, 13:13
EEjester EEjester вне форума
Прохожий
 
Регистрация: 03.07.2014
Сообщения: 15
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Вот так доделал функцию:
Код:
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'));

Может кто подскажет как можно оптимизировать?
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter