Форум: "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.031 c
1-32735           cypher                2002-03-30 01:08  2002.04.11  
Мож кто знает?!


3-32671           Vladimir_Shk          2002-03-20 16:07  2002.04.11  
Trigger result


14-32970          Senia2002             2002-03-04 12:28  2002.04.11  
Часики


1-32819           tall                  2002-03-27 14:17  2002.04.11  
run-time error


1-32898           Cupor                 2002-03-29 19:08  2002.04.11  
Панаели инструментов как в Photoshope