Форум: "WinAPI";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];
ВнизВыключение процесса Найти похожие ветки
← →
TProgrammer (2007-01-14 11:48) [0]Кто-нибудь знает, как выключить процесс по его имени? Я кроме того, что перебирать все Handl"ы с 1 до 4 миилиардов ничего не придумал.
← →
FAskerQ (2007-01-14 12:03) [1]
> TProgrammer (14.01.07 11:48)
Выключить это как ?
← →
kaZaNoVa © (2007-01-14 12:14) [2]Удалено модератором
← →
kaZaNoVa © (2007-01-14 12:14) [3]
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.
← →
FAskerQ (2007-01-14 12:58) [4]
> kaZaNoVa © (14.01.07 12:14) [3]
Жестоко
← →
TProgrammer (2007-01-14 13:03) [5]Спасибо огромное.
← →
Джо © (2007-01-14 13:04) [6]
uses ... TlHelp32, ...;
function FindProcess (AName: string): Integer;
var
Snapshot: THandle;
Lppe: PROCESSENTRY32 ;
begin
Result := -1;
AName := UpperCase(AName);
Snapshot := CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS,0);
if Snapshot = INVALID_HANDLE_VALUE then
RaiseLastOSError;
try
Lppe.dwSize := SizeOf(Lppe);
if Process32First(Snapshot,Lppe) then
begin
repeat
if UpperCase(Lppe.szExeFile) = AName then
begin
Result := Lppe.th32ProcessID;
Break
end;
until not Process32Next(Snapshot,Lppe);
end
else
RaiseLastOSError;
finally
CloseHandle(Snapshot)
end;
end;
procedure KillProcess (PID: Integer);
var
HProcess: THandle;
begin
HProcess := OpenProcess (PROCESS_TERMINATE,False,PID);
if HProcess = 0 then
RaiseLastOSError;
try
if not TerminateProcess(HProcess,1) then
RaiseLastOSError;
finally
CloseHandle (HProcess);
end;
end;
← →
TProgrammer (2007-01-14 13:11) [7]Еще разок спасибо.
← →
TProgrammer (2007-01-14 13:14) [8]А можно узнать к какому процессу принадлежит окно?
← →
xShadow © (2007-01-14 13:20) [9]
GetWindowThreadProcessId( Wnd, PID );
← →
BiN © (2007-01-16 11:00) [10]Замечание: представленные выше методы не будут корректно работать на NT-линейке с процессами, имя образа которых имеет длину больше 16-ти символов.
Решение: получать имя процесса с помощью GetModuleFileNameEx
← →
novill © (2007-01-16 11:18) [11]Одно только озадачивает - в приведенных примерах убиваются ВСЕ одноименные процессы...
хотя и понятно что только по имени процесс однозначно не идентифицируешь...
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.042 c