![]() |
Возникла необходимость закрыть из моей программы чужое запущенное приложение.
подробнее: надо в определенный момент закрыть чужую программу, как это сделать в WIN XP и Win 9x, какой функцией, запускает например WinExec, а есть ли что то с противоположным эффектм. |
pvr30
Запусеать надо не через WinExec, а через SHellExecuteEx или CreateProcess. В этих случаях у тебя будет ProcessHandle, и потом его можно передать в функцию TerminateProcess() |
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; |
mj
Зачем процесс искать и открывать, если процесс создается самолично (следоватьельно, хэндл уже есть). Кроче того, не факт, что свой Notepad найдешь, есть вохможность и чужой прибить. И почему у тебя процесс закрывается, только если удачно прибивается? Закрываться он должен, если открылся. |
vasketsov
>Зачем процесс искать и открывать, если процесс создается самолично Откуда ты знаешь что ему надо конкретно, если он этого не написал? Если бы он его создавал сам, то и закрыть было бы не проблема... >Кроче того, не факт, что свой Notepad найдешь, есть вохможность и чужой прибить Есть и другие более точные методы поисха handle >И почему у тебя процесс закрывается, только если удачно прибивается? чтобы ты спросил... не спорь если не знаешь... услышал где то, что есть функция TerminateProcess, значит теперь всё можешь ей убивать? а вот и нет, не так всё просто, как кажется... [s]Исправлено: mj, 13:13 20-07-2003[/s] |
vasketsov
А разве я сказал что эту чужую погу запустил я (про WinExec я ипомянул как сравнение или аналог с обратным эфектом), нет не я. В принцыпе я сделал по другому, я в своей программе использую handle одного из дочерних окон этой проги А1, ну а далее определяю handle A2:=GetWindow (A1,GW_OWNER); родительского окна и делаю SENDMESSAGE (A2,WM_CLOSE,0,0); Вроде все работает. |
Цитата:
Закрывается главное окно и программа завершает работу |
mj
Цитата:
Итак. Так как ВСЕ объекты ядра (в том числе процесы) поддерживают подсчет ссылок, то для корректного уничтожения объекта в памяти необходимо для каждого открытия его вызывать фукнцию ZwClose (она вызывается из CloseHandle). Если процесс создан, то после удачного вызова TerminateProcess он не перестает существовать. В этом легко убедиться, так как после этого хэндл этого процесса продолжает быть валидным, то есть, можно, например, вызвать некоторые классы информации для ZwQueryInformiationProcess (вышележащие функции ее вызывают, например, для получения ExitCode для процесса и времен создания/ работы в UserMode/ KernelMode/ завершения). Если бы объекта ядра "процесс" не существовало, такое получение информации было бы невозможным. Система может узнать, что сам объект можно уничтожить, только если счетчик ссылок на него обнулится. Именно поэтому и надо вызывать CloseHandle независимо от результата TerminateProcess (иначе эта ссылка вычтется только при завершении процесса, который этот хэндл открыл). Цитата:
Цитата:
Цитата:
Цитата:
В зависимости от постановки задачи, может быть можно вызвать GetWindowThreadProcessId и потом OpenProcess/ TerminateProcess/ CloseHandle, а может надо после GetWindowThreadProcessId вызывать EnumWindows и для каждого из них вызывать GetWindowThreadProcessId чтобы каждому не дочернему окну в этом процессе посылать WM_CLOSE. Короче, это уже от задачи зависит. А может будет точнее идентифицировать процесс по имени файла, образ которого он исполняет? Например, не "Untitled-notepad", а notepad.exe? |
vasketsov
Много слов, а смысла мало... Пользователь рассматривал конкретный случай, а не писал универсальную программу по убиванию блокнотов с одинаковым именем... Добавлено: >Давай подискутируем на тему, "необходимо ли вызывать CloseHandle если удачно вызвался OpenProcess". Малоли чё где написано, это ведь не я придумал, а Borland, они та моумней тебя... А по поводу того что написано на msdn.microsoft.com: так на заборе тоже много чё пишут... >Цитата:Если бы он его создавал сам, то и закрыть было бы не проблема... >Проблема, если бы запускал через WinExec или ShellExecute. Они не возвращают хэндл процесса. Имелось ввиду сам через CreateProcess >Цитата:и делаю SENDMESSAGE >В общем случае неверно. В любом случае это самый безопасный метод, так что говорить "неверно", просто глупо с твоей стороны... |
mj
Цитата:
Цитата:
|
Да друзья ну и понесло вас.
>Цитата: В общем случае неверно. Ты такой командой закрываешь окно. А если у программы несколько равнозначных окон (или, по другому, нет главного) А я и не говорил про общий случай и разве я не ясно выразился что, цитата:"В принцыпе я сделал по другому, я в своей программе использую handle одного из ДОЧЕРНИХ окон этой проги А1, ну а далее определяю handle A2:=GetWindow (A1,GW_OWNER); РОДИТЕЛЬСКОГО окна и делаю SENDMESSAGE (A2,WM_CLOSE,0,0); " >Цитата: Метод можно рассматривать как безопасный или как небезопасный только после того, как он становится рабочим. Уже работает 2 дня и нормально работает. [s]Исправлено: pvr30, 20:16 21-07-2003[/s] |
Здрасьте! А как, глубокоуважаемые, Вы найдете и уничтожите программу у которой нет(допустим, на данный момент нет, или вообще нет) окна? Что если окна в целях экономии ОЗУ создаются, а потом уничтожаются? А вдруг где-нибудь, глубоко в оперативке, сидит себе злобное безоконное приложение и ждет своего часа?
|
vasketsov
Не подскажешь? Ситуация: служба создает процесс (пресловутый Notepad), dwCreationFlags: NORMAL_PRIORITY_CLASS StartupInfo.dwFlags:=STARTF_USESHOWWINDOW; StartupInfo.wShowWindow:=SW_SHOW; Процесс запускается, но без GUI. И при попытке убить процесс с помощью диспетчера задач : "Операция не может быть завершена. Отказано в доступе." В чем дело? Спасибо. |
Guest
1) Почему не видно окна. Служба помечена как неинтерактивная, она запускает notepad в рамках системной оконной станции, которая не видна вошедшему пользователю. Для того, чтобы notepad появлялся, надо либо службе разрешить взаимодействие с рабочим столом, либо, если это своя служба и не хочется ее делать интерактивной, научить создавать процесс на конкретном рабочем столе конкретной оконной станции. Необходимая информация есть в msdn в описании функций CreateProcess (и SetProcessWindowStation с SetThreadDesktop, если хочется уметь переключать процесс с одного рабочего стола на другой). 2) Почему не завершается. Для завершения такого процесса необходимо получить привилегии отладки. Как это делается, уже вроде бы писалось, в любом случае искать надо функцию AdjustTokenPrivileges либо здесь, либо в msdn.microsoft.com. Можно еще попробовать использовать RtlAdjustPrivilege, пример находится здесь внизу: http://ntprog.by.ru/_rtl.htm |
Время: 18:29. |
Время: 18:29.
© OSzone.net 2001-