Форум: "WinAPI";
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];
ВнизУбить Процесс Найти похожие ветки
← →
Севостьянов Игорь (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.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2002.04.11;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.006 c