Pokusavam da pomocu Delphi-a 7 zatvorim proces explorer, ali jednostavno nemam predstavu kako to da uradim. Da li neko moze da pomogne?
Kako pomocu delphi7 zarvoriti proces?
Zaključano
Zakačeno
Citat:
protector1990: Pokusavam da pomocu Delphi-a 7 zatvorim proces explorer, ali jednostavno nemam predstavu kako to da uradim. Da li neko moze da pomogne?
Za nasilno gašenje nekog procesa možeš koristiti API funkciju TerminateProcess, u jedi bibloteci (JclSysInfo unit) ima gotovih funkcija za tu svrhu.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.
How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Pozdrav...
Imam JclSysInfo unit, pronasao sam funkciju: function TerminateApp(ProcessID: DWORD; Timeout: Integer): TJclTerminateAppResult;
Moze li to pomoci? Upload-ovao sam i JclSysInfo unit...
Imam JclSysInfo unit, pronasao sam funkciju: function TerminateApp(ProcessID: DWORD; Timeout: Integer): TJclTerminateAppResult;
Code:
implementation
{$R *.dfm}
uses ActiveX, ShlObj;
type
TJclTerminateAppResult = (taError, taClean, taKill);
function TerminateApp(ProcessID: DWORD; Timeout: Integer): TJclTerminateAppResult;
var
ProcessHandle: THandle;
function EnumWindowsProc(Wnd: HWND; ProcessID: DWORD): Boolean; stdcall;
var
PID: DWORD;
begin
GetWindowThreadProcessId(Wnd, @PID);
if ProcessID = PID then
PostMessage(Wnd, WM_CLOSE, 0, 0);
Result := True;
end;
begin
Result := taError;
if ProcessID <> GetCurrentProcessId then
begin
ProcessHandle := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, ProcessID);
try
if ProcessHandle <> 0 then
begin
EnumWindows(@EnumWindowsProc, ProcessID);
if WaitForSingleObject(ProcessHandle, Timeout) = WAIT_OBJECT_0 then
Result := taClean
else if TerminateProcess(ProcessHandle, 0) then
Result := taKill;
end;
finally
CloseHandle(ProcessHandle);
end;
end;
end;
implementation
{$R *.dfm}
uses ActiveX, ShlObj;
type
TJclTerminateAppResult = (taError, taClean, taKill);
function TerminateApp(ProcessID: DWORD; Timeout: Integer): TJclTerminateAppResult;
var
ProcessHandle: THandle;
function EnumWindowsProc(Wnd: HWND; ProcessID: DWORD): Boolean; stdcall;
var
PID: DWORD;
begin
GetWindowThreadProcessId(Wnd, @PID);
if ProcessID = PID then
PostMessage(Wnd, WM_CLOSE, 0, 0);
Result := True;
end;
begin
Result := taError;
if ProcessID <> GetCurrentProcessId then
begin
ProcessHandle := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, ProcessID);
try
if ProcessHandle <> 0 then
begin
EnumWindows(@EnumWindowsProc, ProcessID);
if WaitForSingleObject(ProcessHandle, Timeout) = WAIT_OBJECT_0 then
Result := taClean
else if TerminateProcess(ProcessHandle, 0) then
Result := taKill;
end;
finally
CloseHandle(ProcessHandle);
end;
end;
end;
Moze li to pomoci? Upload-ovao sam i JclSysInfo unit...
Potpis
Someone's sitting in the shade today because someone planted a tree a long time ago.
Onaj attachment je corrupt-ovan, a ona funkcija ne radi. Mozda sam i ja nesto pogresio, poogledaj da li valja ovaj kod:
To je, kao sto vidis, celokupni kod.
Code:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses ActiveX, ShlObj;
type
TJclTerminateAppResult = (taError, taClean, taKill);
function TerminateApp(ProcessID: DWORD; Timeout: Integer): TJclTerminateAppResult;
var
ProcessHandle: THandle;
function EnumWindowsProc(Wnd: HWND; ProcessID: DWORD): Boolean; stdcall;
var
PID: DWORD;
begin
GetWindowThreadProcessId(Wnd, @PID);
if ProcessID = PID then
PostMessage(Wnd, WM_CLOSE, 0, 0);
Result := True;
end;
begin
Result := taError;
if ProcessID <> GetCurrentProcessId then
begin
ProcessHandle := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, ProcessID);
try
if ProcessHandle <> 0 then
begin
EnumWindows(@EnumWindowsProc, ProcessID);
if WaitForSingleObject(ProcessHandle, Timeout) = WAIT_OBJECT_0 then
Result := taClean
else if TerminateProcess(ProcessHandle, 0) then
Result := taKill;
end;
finally
CloseHandle(ProcessHandle);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
terminateapp(0, 32555);
end;
end.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
uses ActiveX, ShlObj;
type
TJclTerminateAppResult = (taError, taClean, taKill);
function TerminateApp(ProcessID: DWORD; Timeout: Integer): TJclTerminateAppResult;
var
ProcessHandle: THandle;
function EnumWindowsProc(Wnd: HWND; ProcessID: DWORD): Boolean; stdcall;
var
PID: DWORD;
begin
GetWindowThreadProcessId(Wnd, @PID);
if ProcessID = PID then
PostMessage(Wnd, WM_CLOSE, 0, 0);
Result := True;
end;
begin
Result := taError;
if ProcessID <> GetCurrentProcessId then
begin
ProcessHandle := OpenProcess(SYNCHRONIZE or PROCESS_TERMINATE, False, ProcessID);
try
if ProcessHandle <> 0 then
begin
EnumWindows(@EnumWindowsProc, ProcessID);
if WaitForSingleObject(ProcessHandle, Timeout) = WAIT_OBJECT_0 then
Result := taClean
else if TerminateProcess(ProcessHandle, 0) then
Result := taKill;
end;
finally
CloseHandle(ProcessHandle);
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
terminateapp(0, 32555);
end;
end.
To je, kao sto vidis, celokupni kod.
Mogu li da pitam samo jednu sitnicu... kako znas da ne radi?
Potpis
Probao sam, i svi procesi ostaju. Ima li nekog ko ce moci da mi objasni sta znaci ProcessId u deklaraciji funkcije i kako ja da podesim da program zatvori neki odredjen proces?
izmenjeno 1 put, poslednji put reiser 20.04.2006. u 21:15
Izmene poruke
- reiser20.04.2006. u 21:15zapis iz teksta poruke
Unutar windowsa imas jednu "tabelu" gde se cuvaju informacije o svim procesima koji su trenutno aktivni. Prilikom startovanja nekog procesa, windows mu dodeli neki jedinstveni broj, koji se zove Process ID ili krace PID. Taj broj oznacava taj proces, i nijedan drugi proces ne moze imati isti broj. Kad pokrenes task manager, vidis pored imena procesa neke brojeve u opsegu 0-2000, to su u stvari Process ID brojevi.
E sad, ako zelis da ubijes recimo explorer.exe, moras prvo da nadjes njegov PID, i da ga ubijes preko TerminateProcess() fje. PID nalazis preko ove fje:
Kad nadjes PID procesa, prosledi ga ovoj f-ji :
Ne zaboravi da u uses listu dodas TlHelp32 unit.
E sad, ako zelis da ubijes recimo explorer.exe, moras prvo da nadjes njegov PID, i da ga ubijes preko TerminateProcess() fje. PID nalazis preko ove fje:
Code:
uses
Windows, TlHelp32, SysUtils;
function GetProcessID(const procName : String) : DWORD;
var
data : TProcessEntry32;
handler : THandle;
begin
result := 0;
handler := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
data.dwSize := SizeOf(data);
If Process32First(handler, data) Then
Begin
If LowerCase(data.szExeFile) = LowerCase(procName) Then
result := data.th32ProcessID;
While Process32Next(handler, data) Do
If LowerCase(data.szExeFile) = LowerCase(procName) Then
result := data.th32ProcessID;
End;
CloseHandle(handler);
end;
uses
Windows, TlHelp32, SysUtils;
function GetProcessID(const procName : String) : DWORD;
var
data : TProcessEntry32;
handler : THandle;
begin
result := 0;
handler := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
data.dwSize := SizeOf(data);
If Process32First(handler, data) Then
Begin
If LowerCase(data.szExeFile) = LowerCase(procName) Then
result := data.th32ProcessID;
While Process32Next(handler, data) Do
If LowerCase(data.szExeFile) = LowerCase(procName) Then
result := data.th32ProcessID;
End;
CloseHandle(handler);
end;
Kad nadjes PID procesa, prosledi ga ovoj f-ji :
Code:
function KillProcess(const APID : DWORD) : Boolean;
var
procHandle : THandle;
begin
procHandle := OpenProcess(PROCESS_TERMINATE, FALSE, APID);
If procHandle <> 0 Then
Begin
result := TerminateProcess(procHandle, 0);
CloseHandle(procHandle);
End
else
result := FALSE;
end;
function KillProcess(const APID : DWORD) : Boolean;
var
procHandle : THandle;
begin
procHandle := OpenProcess(PROCESS_TERMINATE, FALSE, APID);
If procHandle <> 0 Then
Begin
result := TerminateProcess(procHandle, 0);
CloseHandle(procHandle);
End
else
result := FALSE;
end;
Ne zaboravi da u uses listu dodas TlHelp32 unit.