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

Вниз

Как закрыть процесс?   Найти похожие ветки 

 
Alek ©   (2004-06-24 13:41) [0]

При запуски программы мне нужно заврешить один запущеный в виндовс процесс.
Как это можно сделать?


 
Alek ©   (2004-06-24 13:44) [1]

или как хотябы получить хандл нужного мне процесса?


 
Тимохов ©   (2004-06-24 13:51) [2]

если не ошибаюсь можно последовательно воспользоваться след. функциями winapi

findwindow - найти окно из нужного процесса (по имени)
getwindowthreadprocessid - получить id процесса хозяина окна
openprocess - получить handle процесса
terminateprocess - закрыть процесс


 
Тимохов ©   (2004-06-24 13:56) [3]

Дополнение.

вроде надо не сделать в конце closehandle.


 
jack128 ©   (2004-06-24 13:59) [4]


> вроде надо не сделать в конце closehandle.

Не-а. Как раз таки хендл процесса нужно закрыть..


 
Тимохов ©   (2004-06-24 14:00) [5]


> jack128 ©   (24.06.04 13:59) [4]

пост 3 читать так


> вроде надо сделать в конце closehandle.

опечатка


 
Тимохов ©   (2004-06-24 14:01) [6]


> jack128 ©   (24.06.04 13:59) [4]

изначально было так

вроде надо не забыть сделать в конце closehandle.

"забыть" - забыл дописать :)))


 
Alek ©   (2004-06-24 14:04) [7]

ээ спасибо за советы, а как ими пользоваться?? :)
есть ли готовый примерчик?


 
Тимохов ©   (2004-06-24 14:08) [8]

опять духом халявы потянуло...

откройте msdn.microsoft.com
про каждую прочтите, что не понятно - спрашивайте.
будет из вас программист. Может вам и не надо быть программистом? Тогда я ничем не могу помочь


 
Alek ©   (2004-06-24 14:17) [9]

А вдруг бы прошо :)
Просто я посмотрел справку в делфи и не очень то понял как с ними работать


 
Тимохов ©   (2004-06-24 14:20) [10]


> Alek ©   (24.06.04 14:17) [9]

не смотрите справку дельфи.

я сказал, что это функции win api, т.е. лучше всего они описаны в документации msdn (microsoft software development network), которая в полном (наверное) объеме представлена на msdn.microsoft.com


 
Alek ©   (2004-06-24 14:31) [11]

Почитав справку у меня получилось вот это вот:

getwindowthreadprocessid(FindWindow("Form1",nil),a);
TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS,true,a), а вот тут непонятно что за параметр );


 
Тимохов ©   (2004-06-24 14:34) [12]

0 поставьте.


 
Alek ©   (2004-06-24 14:37) [13]

TerminateProcess(OpenProcess(PROCESS_ALL_ACCESS,true,getwindowthreadprocessid(FindWindow("Form1",nil),a)),0);</COD E>

Насколько я понимаю после этого кода мое приложение должно закрыться, а не закрывается. Что я все же не так сделал?


 
Тимохов ©   (2004-06-24 14:39) [14]

вы внимательно читали справку к getwindowthreadprocessid?


 
Тимохов ©   (2004-06-24 14:41) [15]

никогда не используйте функции winapi.
1. каждая должна быть на одной строке.
2. про каждую надо прочесть, какой она результат возвращает в случае ошибки.
3. обязательно проыерять на такой результат.

следование этим трем советам позволило бы вам уже найти как минимум одну ошибке (а может еще больше - не смотрел внимательно)


 
Alek ©   (2004-06-24 14:47) [16]

насколько я понимаю первый параметр у меня стоит правильно, а вот второй не совсем. Насколько я понял, то во второй параметр записывается идентификатор процеса.
И тип у него поинтер, я дал ему переменныю а - поинтер. Но дальше она нигде не используется ведь.


 
Тимохов ©   (2004-06-24 14:49) [17]

Посмотрите [15].
Если бы вы сделали так, то сразу поняли, что как минимум OpenProcess отрабатывает с ошибкой, т.к. скорее всего такой процесс просто не может быть найден, т.к. в качестве иденитфикатора процесса вы передаете идентификатор потока :)))


 
Alek ©   (2004-06-24 15:00) [18]

h:=FindWindow("Form1",nil);

if h <> null then begin
d:=GetWindowThreadProcessId(h,p);
hndl:=OpenProcess(PROCESS_ALL_ACCESS,true,d);
if hndl <> null then begin
 if not TerminateProcess(hndl,0) then ShowMessage("Error");
end;
end;

Написал тепер я вот это, но всеравно не закрывается мое приложение.


 
Тимохов ©   (2004-06-24 15:02) [19]

початайте внимательно ответ 14 и 17, а также справку к getwindowthreadprocessid (где там вызвращается ид процесса?)


 
Alek ©   (2004-06-24 15:14) [20]

Идентификатор передается во втором параметре

h:=FindWindow("Form1",nil);

if h <> null then begin
GetWindowThreadProcessId(h,@p);
hndl:=OpenProcess(PROCESS_ALL_ACCESS,true,p);
if hndl <> null then begin
 if not TerminateProcess(hndl,0) then ShowMessage("Error");
end;
end;

всеравно не работает :(


 
Тимохов ©   (2004-06-24 15:27) [21]

ладно:
1. в findwindow поменяйте местами параметры.
2. null замените на 0 (два места)

я проверил :)))


 
Тимохов ©   (2004-06-24 15:30) [22]

в мсдн null для числовых параметров значит 0


 
Fay ©   (2004-06-24 15:54) [23]

А нахрен вам PROCESS_ALL_ACCESS?!
PROCESS_TERMINATE не хватит?


 
Тимохов ©   (2004-06-24 16:08) [24]


> Fay ©   (24.06.04 15:54) [23]

да мне то в общем не за чем.

ЗЫ. Нельзя за один урок научить всему:))) Для начала надо научится обработку результата корректно делать.


 
Fay ©   (2004-06-24 16:10) [25]

угу 8)


 
Alek ©   (2004-06-24 17:23) [26]

Тимохов -  спасибо вышло :)

Всем спасибо за предоставленный урок :)


 
Тимохов ©   (2004-06-24 17:26) [27]


> Alek ©   (24.06.04 17:23) [26]

поздравляю!!!



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

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

Наверх




Память: 0.53 MB
Время: 0.051 c
1-1088109321
Destroyer
2004-06-25 00:35
2004.07.11
Иконка из файла на кнопке


1-1088031280
Прямой
2004-06-24 02:54
2004.07.11
Надо прочесть сообщение


4-1085873125
vovchik_29
2004-05-30 03:25
2004.07.11
Свой раздел в pop-up рабочего стола


14-1087991370
AlexG
2004-06-23 15:49
2004.07.11
Еще вопрос про сжатие...


1-1088247574
Lexa
2004-06-26 14:59
2004.07.11
Подскажите плиз как добавить приложение в автозапуск.