![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужно ли закрывать 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]Закрывать хендл нужно в любом случае.