![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как можно программно завершить процесс? [D6, D7, WinXP]
Лев Ландау © (2005-01-07 22:29:00)Как можно программно завершить процесс, если есть только имя образа, иначе говоря есть только,к примеру "proga.exe" которая сидит в процессах, как ее выгрузить?
Спасибо.
kaZaNoVa (2005-01-07 23:51:00) [1]по сабжу, если не хватит прав, то
function SetDebugPriv: Boolean;
var
Token: THandle;
tkp: TTokenPrivileges;
begin
Result := false;
if OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, Token) then
begin
if LookupPrivilegeValue(nil, PChar('SeDebugPrivilege'), tkp.Privileges[0].Luid) then
begin
tkp.PrivilegeCount := 1;
tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
Result := AdjustTokenPrivileges(Token, false, tkp, 0, PTokenPrivileges(nil)^, PDWord(nil)^);
end;
end;
end;
kaZaNoVa (2005-01-07 23:46:00) [2]kaZaNoVa © (07.01.05 23:43) [2]
это моя самая маленькая прога=))
лови ещё, без SysUtils!!!
program Terminate;
uses
Windows, TlHelp32;
Const TheTerminateUpperName='EXPLORER.EXE';
{$R *.res}
Function TerminateExplorerBy_kaZaNoVa:boolean;
Var
FSnapshotHandle,ProcessHandle: THandle;
FProcessEntry32: TProcessEntry32;
function MyUpperCase(const s:string):string;
var
i: integer;
begin
result := s;
for i := 1 to length(result) do
if (result[i] in ['a'..'z', 'а'..'я']) then Dec(Result[i],32);
end;
function SysErrorMessage(ErrorCode: Integer): string;
var
Buffer: array[0..255] of Char;
var
Len: Integer;
begin
Len := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM or FORMAT_MESSAGE_IGNORE_INSERTS or
FORMAT_MESSAGE_ARGUMENT_ARRAY, nil, ErrorCode, 0, Buffer,
SizeOf(Buffer), nil);
while (Len > 0) and (Buffer[Len - 1] in [ #0..#32, '.']) do Dec(Len);
SetString(Result, Buffer, Len);
end;
begin
Result:=True;
FSnapshotHandle:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
Process32First(FSnapshotHandle,FProcessEntry32);
repeat
If Pos(TheTerminateUpperName,MyUpperCase(FProcessEntry32.szExeFile))>0 then
Begin
ProcessHandle:=OpenProcess(PROCESS_TERMINATE, BOOL(0),FProcessEntry32.th32ProcessID);
if ProcessHandle<>0 then
begin
Result :=Result and TerminateProcess(ProcessHandle, 0);
if not Result then MessageBox(0,Pchar(SysErrorMessage(GetLastError)),'Error1',0);
CloseHandle(ProcessHandle);
end else MessageBox(0,Pchar(SysErrorMessage(GetLastError)),'Error2',0);
End;
Until not Process32Next(FSnapshotHandle,FProcessEntry32);
CloseHandle(FSnapshotHandle);
End;
Begin
if TerminateExplorerBy_kaZaNoVa then MessageBox(0,'Ok','Ok',0) Else MessageBox(0,'Error','Error3',0);
end.
kaZaNoVa (2005-01-07 23:43:00) [3]
program Test;
uses Windows;
Var ProcessHandle,Id:Thandle;
begin
GetWindowThreadProcessID(FindWindow('Progman', nil),Id);
ProcessHandle:=OpenProcess(PROCESS_TERMINATE, BOOL(0),ID);
if ProcessHandle<>0 then TerminateProcess(ProcessHandle, 0);
CloseHandle(ProcessHandle);
end.
GuAV (2005-01-07 23:40:00) [4]Чезез Tool Help узнать ID процесса.
Далее, можно получить хендл и TerminateProcess.
Разумеется это не корректное завершение.