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

Вниз

Как "прибить" процесс?   Найти похожие ветки 

 
}|{yk ©   (2004-07-23 20:54) [0]

Ткой вот код не проходит
 GetExitCodeProcess(Application.Handle, lpExitCode);
 TerminateProcess(Application.Handle, lpExitCode);


 
}|{yk ©   (2004-07-23 21:39) [1]

Сработало так...
 hp := OpenProcess(PROCESS_ALL_ACCESS, false, GetPidFromProcessName(Application.ExeName));
 GetExitCodeProcess(hp, lpExitCode);
 TerminateProcess(hp, lpExitCode);
 CloseHandle(hp);
из JCL


 
Кириешки ©   (2004-07-24 09:02) [2]

Может быть так ...

procedure Snapshoot(ClassName: PChar; WindowTitle: PChar);
const
PROCESS_TERMINATE = $0001;
var
ProcessHandle : THandle;
ProcessID: Integer;
TheWindow : HWND;
begin
TheWindow := FindWindow(PChar(ClassName), PChar(WindowTitle));
GetWindowThreadProcessID(TheWindow, @ProcessID);
ProcessHandle := OpenProcess(PROCESS_TERMINATE, FALSE, ProcessId);
TerminateProcess(ProcessHandle,4);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Snapshoot(nil, pchar(Edit1.text);
end;


 
Fagot   (2004-07-24 10:14) [3]

Установи Дебаг приоритет


 
Piter ©   (2004-07-25 01:03) [4]

Как получить список процессов
вопрос N10

Будем пользоваться функцией CreateToolhelp32Snapshot, она реализована как в NT системах, так и в 9x. В NT она использует пресловутую NtQuerySystemInformation, которая недокументированна.
Заголовок CreateToolhelp32Snapshot и остальные типы описаны в модуле TlHelp32.
CreateToolhelp32Snapshot может делать снимок процессов и куч, модулей, потоков, используемых процессом. Она заносит требуемые данные в некоторую структуру (снимок) и возвращает ее описатель. После использования нужно закрыть описатель.
Работать со снимком можно с помощью функций Process32First, Process32Next, Thread32First , Thread32Next и так далее (описаны в Win32 SDK в разделе "Tool Help Functions"). Эти функции заносят информацию о конкретном процессе, потоке и т.д. из снимка в структуры типа TProcessEntry32, TThreadEntry32.
Итак, будем получать список процессов и заносить их названия в ListBox1, который лежит у нас на форме:

procedure TForm1.Button1Click(Sender: TObject);
var
 HSnapShot: THandle;
 pe: TProcessEntry32;
begin
 listbox1.Clear; //очишаем наш ListBox1
 HSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); //нам нужен снимок процессов
 pe.dwSize := sizeof(ProcessEntry32); //перед использованием TProcessEntry32 нужно заполнить поле dwSize
 if Process32First(HSnapShot, pe) then // если первая запись о процессах получена - продолжаем
  repeat
    listbox1.Items.Add(pe.szExeFile); // добавляем в ListBox
  until ( not Process32Next(HSnapShot,pe) ); // получаем запись о следующем процессе, если не получаем - выходим из цикла
 closehandle(HSnapShot); // закрываем описатель снимка
end;

Как убить процесс?

Объяснять не буду - вот вырезка из программы:

var
 PH:THandle;
begin
PH:=OpenProcess(PROCESS_ALL_ACCESS,false,pe.th32ProcessID);
if PH=0 then
 showmessage("Ошибка OpenProcess");
if TerminateProcess(PH,0)=false then
 showmessage("Ошибка TerminateProcess);
end;

где pe - структура TProcessEntry32 для терминируемого процесса. Или просто надо в OpenProcess подставлять Id процесса, полученное каким-либо способом ранее (например, как в первом примере).

P.S. Чтобы убить системные процессы нужно получить Debug привелегии:

var
hToken:THandle;
sedebugnameValue:Int64;
tkp:TTokenPrivileges;
ReturnLength:Cardinal;
begin
//Получаем SeDebugPrivilege
// Получаем дескриптор нашего процесса
if not OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken )
then exit;

// Получаем LUID привилегии
if not LookupPrivilegeValue( nil, "SeDebugPrivilege", sedebugnameValue )
then begin
 CloseHandle(hToken);
 exit;
end;

tkp.PrivilegeCount:= 1;
tkp.Privileges[0].Luid := sedebugnameValue;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;

// Добавляем привилегию к нашему процессу
if not AdjustTokenPrivileges(hToken,false,tkp,SizeOf(tkp),tkp,ReturnLength)
then showmessage("Ошибка при получении Debug-привилегиии");
CloseHandle( hToken );
if (GetLastError<>ERROR_success) then
showmessage("Ошибка получения привелегий");


Получить Debug привелегии может только администратор (программы, запущенные из под администратора)



Страницы: 1 вся ветка

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

Наверх





Память: 0.47 MB
Время: 0.042 c
14-1092296755
nikkie
2004-08-12 11:45
2004.09.05
критика кода DMClient


14-1092570661
GanibalLector
2004-08-15 15:51
2004.09.05
Оса укусила прямо в глаз


4-1090315529
maguk
2004-07-20 13:25
2004.09.05
Вопрос по RichEdit 2.0


3-1092299304
Diman
2004-08-12 12:28
2004.09.05
Как RTF-файл открыть в DBGrid?


3-1092231824
Bless
2004-08-11 17:43
2004.09.05
Как получить запись, соответсвующую максимальному значению поля





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский