Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];

Вниз

Необходимо закрыть чужое приложение/процесс   Найти похожие ветки 

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2006.04.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.043 c
8-1130258903
Dima123
2005-10-25 20:48
2006.04.02
Генерация звука


15-1141910027
Pazitron_Brain
2006-03-09 16:13
2006.04.02
Что я делаю не так?


15-1142060103
Карелин Артем
2006-03-11 09:55
2006.04.02
Рефакторинг проекта. Что посоветуете использовать?


4-1137144109
Andrey C
2006-01-13 12:21
2006.04.02
Програмный клик мышки


2-1142397927
Xmen
2006-03-15 07:45
2006.04.02
Поиск максимума





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский