Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.06.27;
Скачать: CL | DM;

Вниз

Как безусловно удалить процесс?   Найти похожие ветки 

 
Nicky   (2002-04-26 17:33) [0]

Приветствую, уважаемые мастера!

Мне необходимо запустить процесс, причем чтобы он по таймауту безусловно завершался.

Обращаю внимание на то, что внешний процесс пользуется DLL, т. о. завершение д. б. корректным.

Надеюсь на Вашу помощь.
Всего наилучшего!

PS.: Если можно, отвечайте подробнее, т. к. я уже почитал Delphi Help.


 
Vovchik ©   (2002-04-26 17:53) [1]

А как следует необходимость корректного завершения из того, что процесс использует DLL?
Если внешний процесс - не твоя программа, то завершить корректно тебе его не удастся в любом случае, поскольку для корректного завершения необходимо посылать сообщение окну, а если этот процесс не создаёт окон, то посылать сообщение не кому. Если процесс создаёт окно, то можно найти это окно и послать ему сообщение WM_SYSCOMMAND.


 
nicky   (2002-04-26 18:13) [2]

2Vovchik: Есть например 2 функции: ExitProcess и TerminateProcess. Последнюю рекомендуют использовать в крайних случаях, т. к. DLL"кам, используещихся завершаемым процессом не будут сообщено о завершении процесса их использующего.

Будьте добры, дайте пирмерчик!
Я пишу:
if WaitForSingleObject(Proc, TimeOut) <> Wait_Failed then
begin
GetExitCodeProcess(Proc, Result);
ProcStatus := Result;
if ProcStatus <> 0 then
ExitProcess(ProcStatus);
end;
но при обращении к ф-ции ExitProcess выдается ошибка exception class C0000005 с сообщением "Access violation at 0x00000000: read of address 0x00000000":(


 
nicky   (2002-04-26 18:13) [3]

2Vovchik: Есть например 2 функции: ExitProcess и TerminateProcess. Последнюю рекомендуют использовать в крайних случаях, т. к. DLL"кам, используещихся завершаемым процессом не будут сообщено о завершении процесса их использующего.

Будьте добры, дайте пирмерчик!
Я пишу:
if WaitForSingleObject(Proc, TimeOut) <> Wait_Failed then
begin
GetExitCodeProcess(Proc, Result);
ProcStatus := Result;
if ProcStatus <> 0 then
ExitProcess(ProcStatus);
end;
но при обращении к ф-ции ExitProcess выдается ошибка exception class C0000005 с сообщением "Access violation at 0x00000000: read of address 0x00000000":(


 
Suntechnic ©   (2002-04-26 22:19) [4]

>nicky
Ты явно что-то перемудрил. С помощью ExitProcess ты можешь завершить только текущий процесс, но никак не порождённый. А у тебя получается, что ты породил процесс. Дождался его timeout. Потом запрашиваешь его код возврата(тут вообще то тоже не всё чисто. Кто тебе сказал что код возврата должен быть 0? Это может быть любое значение и в том числе STILL_ACTIVE (259)). Затем сравнив этот чужой код возврата с нулём... прибиваешь свой же процесс! Это то поведение котрое ты желаешь получить?


 
Vovchik ©   (2002-04-26 22:23) [5]

А зачем два раза?

Насколько я помню, ExitProcess не завершает ВНЕШНИЙ процесс, а осуществляет выход из текущего процесса.
Ещё раз: корректно завершить процесс можно только послав сообщение его главному окну. Это если это "обычный" процесс. Если ты пишешь прогу сам, то конечно можешь предусмотреть завершение процесса у которого нет окон, например, созданием какого-нибудь мутекса или чего-нибудь такого.


 
NickyBoy   (2002-04-28 13:53) [6]

Спасибо, что растолковали мне, умные люди!
С мутексами я повременил, а так - меня устроило:

procedure TForm1.BitBtn2Click(Sender: TObject);
VAR
Wnd : hWnd;
buff: ARRAY [0..127] OF Char;
begin
if not (MessageDlg( "



Страницы: 1 вся ветка

Текущий архив: 2002.06.27;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.014 c
1-88861
vova11
2002-06-16 16:00
2002.06.27
Разность между двумя датами


14-88988
vopros
2002-05-24 10:37
2002.06.27
Весна. Почему столько страшных девушек.


1-88912
Max79
2002-06-07 22:00
2002.06.27
как передать рисунок из приложения в Word???


3-88714
First_May
2002-06-03 15:11
2002.06.27
D5 + Excel


1-88867
Мефодий
2002-06-13 20:12
2002.06.27
Мастера ! Где же вы ? Помогите же !!!!!