Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Delphi: как закрыть чужую прогу

Ответить
Настройки темы
Delphi - Delphi: как закрыть чужую прогу

Новый участник


Сообщения: 18
Благодарности: 0

Профиль | Отправить PM | Цитировать


Возникла необходимость закрыть из моей программы чужое запущенное приложение.
подробнее: надо в определенный момент закрыть чужую программу, как это сделать в WIN XP и Win 9x, какой функцией, запускает например WinExec, а есть ли что то с противоположным эффектм.

Отправлено: 17:15, 19-07-2003

 

Модер


Сообщения: 1716
Благодарности: 17

Профиль | Сайт | Отправить PM | Цитировать


pvr30
Запусеать надо не через WinExec, а через SHellExecuteEx или CreateProcess. В этих случаях у тебя будет ProcessHandle, и потом его можно передать в функцию TerminateProcess()

-------
Васкецов Сергей
http://registry.oszone.net


Отправлено: 20:33, 19-07-2003 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.

mj mj вне форума

Пользователь


Сообщения: 25
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


function  KillProc(const ClassName:AnsiString):Boolean;

 {Terminates the first process with the given window class.  Window class is
  fixed whereas Window title can change.

  Example: KillProc('NOTEPAD') unconditionally terminates Windows Notepad if
           it is running. }
var
 hWnd,hProc:THandle;
 pid:DWORD;
begin
 Result:=False;
 hWnd := FindWindow(PCHAR(ClassName),nil);
 if IsWindow(hWnd) then begin
   GetWindowThreadProcessId(hWnd, @pid);
   hproc := OpenProcess(PROCESS_TERMINATE, FALSE, pid);
   if hproc<>0 then begin
     Result:=TerminateProcess(hProc,0);
     if Result then CloseHandle(hProc);
   end;
 end;
end;

-------
...


Отправлено: 20:48, 19-07-2003 | #3


Модер


Сообщения: 1716
Благодарности: 17

Профиль | Сайт | Отправить PM | Цитировать


mj
Зачем процесс искать и открывать, если процесс создается самолично (следоватьельно, хэндл уже есть). Кроче того, не факт, что свой Notepad найдешь, есть вохможность и чужой прибить. И почему у тебя процесс закрывается, только если удачно прибивается? Закрываться он должен, если открылся.

-------
Васкецов Сергей
http://registry.oszone.net


Отправлено: 00:20, 20-07-2003 | #4

mj mj вне форума

Пользователь


Сообщения: 25
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


vasketsov
>Зачем процесс искать и открывать, если процесс создается самолично
Откуда ты знаешь что ему надо конкретно, если он этого не написал? Если бы он его создавал сам, то и закрыть было бы не проблема...
>Кроче того, не факт, что свой Notepad найдешь, есть вохможность и чужой прибить
Есть и другие более точные методы поисха handle
>И почему у тебя процесс закрывается, только если удачно прибивается?
чтобы ты спросил... не спорь если не знаешь...
услышал где то, что есть функция TerminateProcess, значит теперь всё можешь ей убивать? а вот и нет, не так всё просто, как кажется...

[s]Исправлено: mj, 13:13 20-07-2003[/s]

-------
...


Отправлено: 10:11, 20-07-2003 | #5


Новый участник


Сообщения: 18
Благодарности: 0

Профиль | Отправить PM | Цитировать


vasketsov
А разве я сказал что эту чужую погу запустил я (про WinExec я ипомянул как сравнение или аналог с обратным эфектом), нет не я. В принцыпе я сделал по другому, я в своей программе использую handle одного из дочерних окон этой проги А1, ну а далее определяю handle A2:=GetWindow (A1,GW_OWNER); родительского окна и делаю SENDMESSAGE (A2,WM_CLOSE,0,0);
Вроде все работает.

Отправлено: 15:12, 20-07-2003 | #6


Аватара для Guest

Guest


Профиль | Цитировать


Цитата:
SENDMESSAGE (A2,WM_CLOSE,0,0);
Ну это называется вежливо попрость программу закрытся...
Закрывается главное окно и программа завершает работу

Отправлено: 16:01, 20-07-2003 | #7


Модер


Сообщения: 1716
Благодарности: 17

Профиль | Сайт | Отправить PM | Цитировать


mj
Цитата:
не спорь если не знаешь...
Давай подискутируем на тему, "необходимо ли вызывать CloseHandle если удачно вызвался OpenProcess". Идем на msdn.microsoft.com и не путаем остальных.

Итак.

Так как ВСЕ объекты ядра (в том числе процесы) поддерживают подсчет ссылок, то для корректного уничтожения объекта в памяти необходимо для каждого открытия его вызывать фукнцию ZwClose (она вызывается из CloseHandle).

Если процесс создан, то после удачного вызова TerminateProcess он не перестает существовать. В этом легко убедиться, так как после этого хэндл этого процесса продолжает быть валидным, то есть, можно, например, вызвать некоторые классы информации для ZwQueryInformiationProcess (вышележащие функции ее вызывают, например, для получения ExitCode для процесса и времен создания/ работы в UserMode/ KernelMode/ завершения). Если бы объекта ядра "процесс" не существовало, такое получение информации было бы невозможным. Система может узнать, что сам объект можно уничтожить, только если счетчик ссылок на него обнулится. Именно поэтому и надо вызывать CloseHandle независимо от результата TerminateProcess (иначе эта ссылка вычтется только при завершении процесса, который этот хэндл открыл).

Цитата:
Есть и другие более точные методы поисха handle
Ага, особено если и искать не надо. А если есть 2 нотепада, у обоих заголовок - "Untitled-notepad", как ты выберешь, какой прибить, если прибить надо ровно один (например, задача не позволить запускать более одного блокнота)? Необходимо в начальной постановке указывать, например, что он запущен под тем же пользователем, или родитель у него- текущий процесс. Тем более что FindWindow ни при каких обстоятельствах не ищет окна, принадлежащие другой пользовательской сессии (то есть, на другой оконной станции, например, если зашел терминальный юзер или служба выполняется под выделенной учетной записью или системной неинтерактивной), а неименованный десктоп может создать ЛЮБОЙ пользователь в системе, и FindWindow тут обломается найти окно по полной программе. Короче, 2 балла за матчасть.

Цитата:
Если бы он его создавал сам, то и закрыть было бы не проблема...
Проблема, если бы запускал через WinExec или ShellExecute. Они не возвращают хэндл процесса.

Цитата:
услышал где то, что есть функция TerminateProcess, значит теперь всё можешь ей убивать?
Нет. Ей можно завершить процесс, если удастся открыть его с правом TERMINATE и если он не завис на любом системном примитиве синхронизации в ядре. Если процесс работает и есть привилегия отладки, завершить ей можно любой процесс кроме псевдопроцесса SYSTEM (его с указанным правом не открыть) и IDLE (его вообще не открыть, так как у него нулевой идентификатор). А то что кому-то кажется, что там не так все просто - это личные проблемы каждого, а мне все же интересно, что же там может быть такого сложного, что необходимо отказываться от правильной системы подсчета ссылок.

Цитата:
и делаю SENDMESSAGE
В общем случае неверно. Ты такой командой закрываешь окно. А если у программы несколько равнозначных окон (или, по другому, нет главного) - то тебе придется посылать WM_CLOSE им всем.
В зависимости от постановки задачи, может быть можно вызвать GetWindowThreadProcessId и потом OpenProcess/ TerminateProcess/ CloseHandle, а может надо после GetWindowThreadProcessId вызывать EnumWindows и для каждого из них вызывать GetWindowThreadProcessId чтобы каждому не дочернему окну в этом процессе посылать WM_CLOSE. Короче, это уже от задачи зависит. А может будет точнее идентифицировать процесс по имени файла, образ которого он исполняет? Например, не "Untitled-notepad", а notepad.exe?

-------
Васкецов Сергей
http://registry.oszone.net


Отправлено: 00:37, 21-07-2003 | #8

mj mj вне форума

Пользователь


Сообщения: 25
Благодарности: 0

Профиль | Сайт | Отправить PM | Цитировать


vasketsov
Много слов, а смысла мало...
Пользователь рассматривал конкретный случай, а не писал универсальную программу по убиванию блокнотов с одинаковым именем...

Добавлено:

>Давай подискутируем на тему, "необходимо ли вызывать CloseHandle если удачно вызвался OpenProcess".

Малоли чё где написано, это ведь не я придумал, а Borland, они та моумней тебя... А по поводу того что написано на msdn.microsoft.com: так на заборе тоже много чё пишут...

>Цитата:Если бы он его создавал сам, то и закрыть было бы не проблема...
>Проблема, если бы запускал через WinExec или ShellExecute. Они не возвращают хэндл процесса.

Имелось ввиду сам через CreateProcess

>Цитата:и делаю SENDMESSAGE
>В общем случае неверно.

В любом случае это самый безопасный метод, так что говорить "неверно", просто глупо с твоей стороны...

-------
...


Отправлено: 11:07, 21-07-2003 | #9


Модер


Сообщения: 1716
Благодарности: 17

Профиль | Сайт | Отправить PM | Цитировать


mj
Цитата:
Малоли чё где написано, это ведь не я придумал, а Borland, они та моумней тебя... А по поводу того что написано на msdn.microsoft.com: так на заборе тоже много чё пишут...
То есть, весь мир (включая M$) под M$ пишет неправильно, один борланд правильно? Кстати, откуда этот кусок, что ты на борланд ссылаешься? Попробуй взять кусок кода, открывающий/убивающий процесс/закрывающий его и натравить на процесс, запущенный из Delphi из-под отладчика (в этом случае как рз процесс для системы будет подвешен на примитиве синхронизации типа Event). Возьми HandleEx или аналог с сайта sysinternals от Руссиновича и смотри, как у тебя будет расти количество открытых хэндлов на процесс, открыть ты его сможешь, а закрыть - нет.

Цитата:
В любом случае это самый безопасный метод
Метод можно рассматривать как безопасный или как небезопасный только после того, как он становится рабочим. Если у программы нет понятия главного окна (например, Explorer, запущенный не как Shell и с отключенной опцией создавать для отдельного окна процесс) - ее таким образом не закрыть до закрытия последнего окна либо даже не закрыть совсем (смотря как писать обработчик сообщений и какой критерий завершения программы в этом случае выбрать, просто "нет открытых окон" не всегда корректный критерий для такого случая).

-------
Васкецов Сергей
http://registry.oszone.net


Отправлено: 15:11, 21-07-2003 | #10



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Delphi - Delphi: как закрыть чужую прогу

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Разное - [решено] Example | Скрываем чужую консоль hasherfrog Программирование и базы данных 56 28-12-2015 11:33
Вопрос - Как закрыть telnet? doc.ru Защита компьютерных систем 1 12-10-2009 21:25
Доступ - как мне для студента закрыть доступ на другой локальный диск, закрыть доступ к реестр nisan Microsoft Windows 2000/XP 10 12-09-2009 21:14
как закрыть шары vovas Microsoft Windows 2000/XP 0 08-02-2006 17:04
Как закрыть папку ND Microsoft Windows 95/98/Me 7 11-02-2002 07:33




 
Переход