Форум: "Основная";
Текущий архив: 2004.07.11;
Скачать: [xml.tar.bz2];
ВнизКак закрыть процесс? Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.031 c