Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Выключение процесса [WinXP]


TProgrammer ©   (2007-01-14 11:48:00) 

Кто-нибудь знает, как выключить процесс по его имени? Я кроме того, что перебирать все Handl'ы с 1 до 4 миилиардов ничего не придумал.


novill   (2007-01-16 11:18:00) [1]

Одно только озадачивает - в приведенных примерах убиваются ВСЕ одноименные процессы...
хотя и понятно что только по имени процесс однозначно не идентифицируешь...


BiN   (2007-01-16 11:00:00) [2]

Замечание: представленные выше методы не будут корректно работать на NT-линейке с процессами, имя образа которых имеет длину больше 16-ти символов.
Решение: получать имя процесса с помощью GetModuleFileNameEx


xShadow   (2007-01-14 13:20:00) [3]

GetWindowThreadProcessId( Wnd, PID );


TProgrammer   (2007-01-14 13:14:00) [4]

А можно узнать к какому процессу принадлежит окно?


TProgrammer   (2007-01-14 13:11:00) [5]

Еще разок спасибо.


Джо   (2007-01-14 13:04:00) [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:03:00) [7]

Спасибо огромное.


FAskerQ   (2007-01-14 12:58:00) [8]


> kaZaNoVa ©   (14.01.07 12:14) [3]


Жестоко


kaZaNoVa   (2007-01-14 12:14:00) [9]

Удалено модератором


kaZaNoVa   (2007-01-14 12:14:00) [10]

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:03:00) [11]


> TProgrammer   (14.01.07 11:48)


Выключить это как ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо