Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Нужно ли закрывать Handle терминированного процесса ?


Alex_Petr ©   (2005-02-12 04:58:00) 

Здравствуйте !
Делаю так:
procedure WaitRunningProcess(const Sour:TFileName; const TmOut:DWord);
var
ProcID:Int64;
ProcHand:THandle;
List:TStringList;
begin
ProcID:=0;
if not FileExists(Sour) then Exit;
List:=TStringList.Create;
if RunningProcessesList(List,True)then // Здесь получаю список процессов
 begin
  ProcID:=List.IndexOf(Sour);
  if ProcID>-1 then
   begin
    ProcID:=DWord(List.Objects[ProcID]); // В Objects записаны ID процессов
    ProcHand:=OpenProcess(SYNCHRONIZE,False,ProcID);
    if ProcHand>0 then
     try
      WaitForSingleObject(ProcHand,TmOut);
     finally
      CloseHandle(ProcHand);
      // Необходима ли эта строка, если  WaitForSingleObject возвращает WAIT_OBJECT_0 ( ошибки не выдает )
      // или корректнее писать так: WaitResult:=WaitForSingleObject(ProcHand,TmOut);
      // if WaitResult<>WAIT_OBJECT_0 then CloseHandle(ProcHand);
     end;
   end;
 end;
List.Free;
end;


panov   (2005-02-12 19:07:00) [1]

Вопрос не соответствует теме конференции.


Alex_Petr   (2005-02-12 18:05:00) [2]

Спасибо за ссылку: помогло разобраться.


jack128   (2005-02-12 10:05:00) [3]

Хе, ну так если процесс уже выгружен, то откуда ж у него могут взятся загруженные модули?

вот почитай http://www.delphimaster.ru/cgi-bin/forum.pl?id=1106747384&n=3 где то с поста 40 ого..


Alex_Petr   (2005-02-12 08:49:00) [4]

Проверил: ничего подобного.
Возвращает ошибку: Handle is invalid


Alex_Petr   (2005-02-12 08:37:00) [5]

Стало интересно. Сейчас проверю.


Alex_Petr   (2005-02-12 08:36:00) [6]

jack128 ©   (12.02.05 7:37) [3]
Т.е., если я не закрою Handle, то я могу пол часа валять дурака,
а потом спросить GetModuleFileNameEx(ProcHand,...
и получить ответ, хотя никакого процесса давно уже нет.
Я тебя правильно понял ?


jack128   (2005-02-12 07:38:00) [7]

jack128 ©   (12.02.05 7:37) [3]
объект ядра "процесс" будет существоватьпока не будут закрыты все его хендлы.


jack128   (2005-02-12 07:37:00) [8]

объект ядра "процесс" пока не будут закрыты все его хендлы. А то что сам процесс завершился - это дело десятое. Ты все еще можешь использовать ProcHand, например, в функции GetExitCode..


Alex_Petr   (2005-02-12 07:03:00) [9]

jack128 ©   (12.02.05 6:22) [1]
Да, но процесса то уже не существует.


jack128   (2005-02-12 06:22:00) [10]

Закрывать хендл нужно в любом случае.


Наверх

Титульная страница Поиск, карта сайта Написать письмо