Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.09.2015, 09:49   #1
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию Как проверить, есть ли процесс с указаным PID

Здравствуйте.

Я знаю PID процесса, задача определить, жив ли он.


Делаю это так:

Код:
function CheckProcess(ControlPID:integer):boolean;
var
  hProcess:Cardinal;
begin
  hProcess := OpenProcess(PROCESS_TERMINATE, FALSE, ControlPID);
  if (hProcess<>0) then begin
    CloseHandle(hProcess);
    result:=True;
  end else begin
    result:=False;
  end;
end;
Но проблема в том, что если при первой проерке процесс был жив, даже после смерти процесса эта функция всегда скажет что процесс живой.

Как исправить проблему?
Как определить есть ли процес с указаным PID?

(Вариант с получение полного писка процессов не рассматриваю, так как есть много ресурсов)



Спасибо
lollollollol вне форума Ответить с цитированием
Старый 18.09.2015, 11:08   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Получить HANDLE процесса, потом ждать его завершения через WaitForSingleObject функцию.
waleri вне форума Ответить с цитированием
Старый 18.09.2015, 11:18   #3
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

бред, а если я проверяю сразу 20 процессов, мне создавать 20 доп потоков? Мне может нужно раз в час проверить жив ли процесс.

Т.е. мне нужно открыть процесс, если успех - процесс живой.

Что я и делаю. Но я не понимаю почему после смерти процесса он всё равно считается живым.

добавлю:

1. Создаю ПРОВЕРЯЕМЫЙ процесс, назовём a
2. Создаю 2 ПРОЕРЯЮЩИХ процесса, назовём b и c
3. В процессе b проверяю процесс a - живой
4. Завершаю процесс a
5. В процесса b проверяю процесс a - ЖИВОЙ
6. В процессе c проверяю процесс a - НЕ живой.

т.е. получается что если оть раз проверял живой процесс, даже после завершения он будет определяться как живой

Последний раз редактировалось Stilet; 18.09.2015 в 11:42.
lollollollol вне форума Ответить с цитированием
Старый 18.09.2015, 11:54   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

WaitForMultipleObjects не?
Цитата:
Но я не понимаю почему после смерти процесса он всё равно считается живым.
вы не проверяете процесс на тот факт жив он или нет.
вы проверяете сущеествование процесса с указанным PID, это разное.
процесс существует пока выполняется и пока имеет на себя незакрытые ссылки.(может у вас в другом месте хэндл висит?)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 18.09.2015, 13:14   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Тогда раз в час вызывайте GetExitCodeProcess()
waleri вне форума Ответить с цитированием
Старый 18.09.2015, 16:33   #6
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

а разве CloseHandle(hProcess); недостаточно?

Цитата:
Тогда раз в час вызывайте GetExitCodeProcess()

так работает, но я не понимаю почему мой код не работает.

Последний раз редактировалось Stilet; 18.09.2015 в 21:47.
lollollollol вне форума Ответить с цитированием
Старый 18.09.2015, 17:50   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Вот здесь объяснение:
http://programmersforum.ru/showpost....31&postcount=4
waleri вне форума Ответить с цитированием
Старый 18.09.2015, 18:39   #8
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

Цитата:
вы не проверяете процесс на тот факт жив он или нет.
вы проверяете сущеествование процесса с указанным PID, это разное.
процесс существует пока выполняется и пока имеет на себя незакрытые ссылки.(может у вас в другом месте хэндл висит?)
Ну верно, процесс завершил - его больше не существует. Это меня и интересует.
Процесс я открываю только в одном месте и только кодом который я указал.
После заверения процесса все проги типа ProcesExplorer и т.д. показывают что процесса больше нет.

А мой софт всё равно говорит что он есть.

Получается что после вызова OpenProcess и CloseHandle, по факту хендл не закрывается? ЧТо ещё требуется сделать чтобы коректно закончить работу с процессом?
lollollollol вне форума Ответить с цитированием
Старый 18.09.2015, 19:08   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Скорее всего ControlPID содержит номер другото процесса.
Мне трудно поверить, что OpenProcess откроет несуществующий процесс.
Отладчик и вперед...

Edit:
О, сегодняшняя статья в тему:
http://blogs.msdn.com/b/oldnewthing/.../10642343.aspx

Последний раз редактировалось waleri; 18.09.2015 в 20:52.
waleri вне форума Ответить с цитированием
Старый 18.09.2015, 21:45   #10
lollollollol
Форумчанин
 
Регистрация: 23.03.2013
Сообщений: 218
По умолчанию

ControlPID точно содержит верный номер.

Как минимум потому что я добавил GetExitCodeProcess после получения хендла, и всё работает как надо.

Да и проверить мою беду не так и сложно, 15-20 минут времени. Как воссоздать проблему я подробно описал в сообщении номер 3
lollollollol вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить handle и пользователя, запустившего процесс, зная PID Night_Devil Win Api 5 10.06.2012 13:16
Как проверить запущен ли процесс? Chanterz C# (си шарп) 1 05.02.2012 00:53
Как программно проверить и отключить процесс Explorer ! asked86 Win Api 10 17.12.2008 11:04
Как проверить, есть ли файл? Dux Общие вопросы Delphi 3 02.04.2008 23:18