Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.06.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.06.27;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.007 c
1-88849
agent_007
2002-06-14 09:57
2002.06.27
Вставка текста в прилож-е в кот-м в данный момент наход-ся курсор


1-88923
Windeus
2002-06-15 04:05
2002.06.27
to #num line in RichEdit


1-88878
Сатир
2002-06-13 15:57
2002.06.27
class function


1-88848
Boger
2002-06-17 12:03
2002.06.27
Checkboxes и Images в listView несовместимы?!?


3-88722
kay
2002-06-03 22:36
2002.06.27
SQL: INDEX





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский