Текущий архив: 2006.04.02;
Скачать: CL | DM;
ВнизНеобходимо закрыть чужое приложение/процесс Найти похожие ветки
← →
mao (2006-01-15 09:39) [0]Подскажите, плиз (желательно на примере), как можно закрыть чужое работающее приложение/процесс из своей программы?
← →
Fay © (2006-01-15 10:08) [1]2 mao (15.01.06 9:39)
TerminateProcess?
← →
mao (2006-01-15 12:24) [2]Не получается... А как узнать handle?
← →
begin...end © (2006-01-15 12:27) [3]> mao (15.01.06 12:24) [2]
Что известно о чужом процессе? Является ли он дочерним для Вашего процесса?
← →
Rouse_ © (2006-01-15 19:22) [4]Зачем сразу так категорично терминировать... ?
Сначало обычно дают шанс ему самому завершиться WM_CLOSE, WM_QUIT, WM_ENDSESSION и только потом шашкой махают...
← →
Чапаев © (2006-01-16 10:07) [5]
> Сначало обычно дают шанс ему самому завершиться WM_CLOSE,
> WM_QUIT, WM_ENDSESSION и только потом шашкой махают...
Таки да. Если у приложения есть дополнительные потоки, то "шашкой" можно такого намахать...
← →
mao (2006-01-16 17:29) [6]В общем, у меня такая ситуация. Запускается программа (ее запускает пользователь) и работает. На самом деле, эта программа состоит из двух exe-шников – один загружается в другой, как в кантейнер. В WinXP они отображаются, как два запущенных приложения, два процесса. Мне нужно написать такую программу, которая будет жестко закрывать (убивать без предупреждения, освобождать память) эти два приложения (процесса). Я, конечно, понимаю, что не важно, что их два, т.к. научившись закрывать одно стороннее приложение, я смогу убить и два. :) Понятно, что эти процессы создает не моя прога – это совершенно отдельное приложение. Моя программа просто должна по нажатию кнопки на форме закрывать это запущенное приложение (как я говорил на самом деле их два), о котором кроме названия мне практически ничего не известно. Пример: человек запускает Калькулятор (calc.exe), а потом запускает мою прогу и хочет, чтобы по нажатию кнопки на моей проги закрывался Калькулятор. Вот...
← →
begin...end © (2006-01-16 17:59) [7]> mao (16.01.06 17:29) [6]
Насколько я понял, речь идёт о Windows XP. Тогда:
1. Вызвать EnumProcesses, получив список идентификаторов запущенных процессов.
2. Цикл:
2.1. Открыть очередной процесс по его идентификатору (OpenProcess с правом доступа PROCESS_QUERY_INFORMATION).
2.2. Вызвать GetProcessImageFileName для полученного хэндла.
2.3. Сравнить полученный путь к исполняемому файлу процесса с нужным; если они совпадают, то искомый процесс найден: вызвать TerminateProcess, закрыть хэндл и выйти из цикла, иначе закрыть хэндл и продолжить цикл.
← →
Хинт © (2006-01-16 18:18) [8]{ Эта небольшая функция закрывает приложения, соответствующие заданному имени .exe.
Пример: KillTask("notepad.exe");
KillTask("iexplore.exe"); }uses
Tlhelp32, Windows, SysUtils;
function KillTask(ExeFileName: string): integer;
const
PROCESS_TERMINATE=$0001;
var
ContinueLoop: BOOL;
FSnapshotHandle: THandle;
FProcessEntry32: TProcessEntry32;
begin
result := 0;
FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);
while integer(ContinueLoop) <> 0 do
begin
if ((UpperCase(ExtractFileName(FProcessEntry32.szExeFile)) =
UpperCase(ExeFileName))
or (UpperCase(FProcessEntry32.szExeFile) =
UpperCase(ExeFileName))) then
Result := Integer(TerminateProcess(OpenProcess(
PROCESS_TERMINATE, BOOL(0),
FProcessEntry32.th32ProcessID), 0));
ContinueLoop := Process32Next(FSnapshotHandle,
FProcessEntry32);
end;
CloseHandle(FSnapshotHandle);
end;
{ убивание процесса отладочным методом }
(по крайней мере раньше этим способом можно было закрыть антивирус Касперского)Function DebugKillProcess(ProcessId: dword): boolean;
var
pHandle: dword;
myPID: dword;
HandlesInfo: PSYSTEM_HANDLE_INFORMATION_EX;
r: dword;
begin
Result := false;
myPID := GetCurrentProcessId();
if not EnableDebugPrivilege() then Exit;
//подключаемся к системе отладки и получаем DebugObject
if DbgUiConnectToDbg() <> STATUS_SUCCESS then Exit;
pHandle := OpenProcessEx(ProcessId);
//включаем отладку процесса
if DbgUiDebugActiveProcess(pHandle) <> STATUS_SUCCESS then Exit;
//надо найти полученный DebugObject
HandlesInfo := GetInfoTable(SystemHandleInformation);
if HandlesInfo = nil then Exit;
for r := 0 to HandlesInfo^.NumberOfHandles do
if (HandlesInfo^.Information[r].ProcessId = myPID) and
(HandlesInfo^.Information[r].ObjectTypeNumber = $8) //DebugObject
then begin
//закрываем DebugObject, что приводит к уничтожению отлаживаемого процесса
CloseHandle(HandlesInfo^.Information[r].Handle);
Result := true;
break;
end;
VirtualFree(HandlesInfo, 0, MEM_RELEASE);
end;
Страницы: 1 вся ветка
Текущий архив: 2006.04.02;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.05 c