Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.04.11;
Скачать: CL | DM;

Вниз

Убить Процесс   Найти похожие ветки 

 
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.




Страницы: 1 вся ветка

Текущий архив: 2002.04.11;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.014 c
1-32737
sany
2002-03-30 06:34
2002.04.11
Позалуйста, пришлите мне DsgnIntf.dcu


4-33001
Vladimir_Shk
2002-02-07 11:00
2002.04.11
EventLog


4-33018
Landgraph
2002-02-12 13:32
2002.04.11
TStream


1-32734
Locked
2002-03-30 08:08
2002.04.11
Помогите пожалуйста!!!


1-32742
dimonf
2002-03-29 09:39
2002.04.11
Народ, подскажите, как мне вывести на печать TConvas Panel-и?