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




Вниз

Убить Процесс 


Yaro   (2002-02-10 01:00) [0]

Как убить процесс, если известно его имя?



pasha676   (2002-02-11 11:29) [1]

CloseHandle(MyThread) где MyThread - хэндл на поток. Это если ты запускаешь парралельный поток с помощью CreateThread

Если ты запускаешь другой exe файл с помощью CreateProcess
то закрыть его можно послав ему (процессу) месагу
PostMessage(MyHandle, WM_CLOSE,0,0); где MyHandle - соответственно его хэндл.



Севостьянов Игорь   (2002-02-11 14:32) [2]

У меня другой вариант, хотя я не считаю что это правильно убивать по имени процесса, ведь имя не есть уникальный параметр
по всем вопросам по мылу. Ну и вот собственно рабочий пример:

unit Main;

interface

uses
Windows, SysUtils, Classes, Forms, Dialogs,
Controls, StdCtrls, PSAPI;

type
TfrmMain = class(TForm)
btnTreminate: TButton;
procedure btnTreminateClick(Sender: TObject);
function GetProcesses(const ProcessName: PChar; var Error: DWORD; var Source: string): BOOL;
end;

var
frmMain: TfrmMain;

implementation

{$R *.DFM}


procedure TfrmMain.btnTreminateClick(Sender: TObject);
var
Error: DWORD;
Source: string;
begin
if not GetProcesses("internet.exe", Error, Source)
then ShowMessage(Format("Error: %x"#13#10"Error: %s"#13#10"Source: %s",
[Error, SysErrorMessage(Error), Source]));
end;

function TfrmMain.GetProcesses(const ProcessName: PChar; var Error: DWORD; var Source: string): BOOL;
var
hProc : THANDLE;
aProcesses : array [0..1023] of DWORD;
cbNeeded,
cProcesses,
hMod : DWORD;
szProcessName : array [0..255] of Char;
i : integer;
uiExitCode : UINT;

procedure SetErrorSource(Err: DWORD; Src: string);
begin
Error := Err;
Source := Src;
SetLastError(0);
end;

begin
Result := False;
uiExitCode := DWORD(-1);

if EnumProcesses(@aProcesses, SizeOf(aProcesses), cbNeeded) then // получаем список идентификаторов
// всех запущенных процессов
begin
cProcesses := Trunc(cbNeeded / sizeof(DWORD));
for i:=0 to cProcesses-1 do // итерируем по процессам
begin
//PROCESS_TERMINATE
hProc := OpenProcess(PROCESS_ALL_ACCESS, FALSE, aProcesses[i]); // получаем хендл процесса по его пиду
if (hProc <> 0) then
begin
if EnumProcessModules(hProc, @hMod, SizeOf(hMod), cbNeeded) then // получаем список модулей процесса
begin
if GetModuleBaseName(hProc, hMod, szProcessName, SizeOf(szProcessName)) <> 0 then // получаем имя главного модуля
begin
if (StrIComp(szProcessName, ProcessName) = 0) then // наш процесс?
begin
Result := TerminateProcess(hProc, uiExitCode); // останавливаем процесс
SetErrorSource(GetLastError, "TerminateProcess");
Exit;
end
else
SetErrorSource(0, "Process with such name is not found");
end
else
SetErrorSource(GetLastError, "GetModuleBaseName");
end
else
SetErrorSource(GetLastError, "EnumProcessModules");
end
else
SetErrorSource(GetLastError, "OpenProcess");
end;
end
else
SetErrorSource(GetLastError, "EnumProcesses");
end;

end.




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




Наверх





Память: 0.73 MB
Время: 0.018 c
1-32866           LazorenkoX            2002-03-29 13:03  2002.04.11  
file of XXX


1-32768           GMV                   2002-03-30 22:27  2002.04.11  
Memo1.Text


1-32893           Alx2                  2002-03-29 17:19  2002.04.11  
Чего-то я не улавливаю :(


6-32929           dougine               2002-01-30 09:41  2002.04.11  
Помогите отправить SMS на мобилу


3-32700           MAxiMum               2002-03-13 15:23  2002.04.11  
Изменения в сетевой БД