[ protector1990 @ 19.04.2006. 22:19 ] @
Pokusavam da pomocu Delphi-a 7 zatvorim proces explorer, ali jednostavno nemam predstavu kako to da uradim. Da li neko moze da pomogne? |
[ protector1990 @ 19.04.2006. 22:19 ] @
[ savkic @ 20.04.2006. 09:42 ] @
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. [ Miloš Baić @ 20.04.2006. 11:56 ] @
Pozdrav...
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; Moze li to pomoci? Upload-ovao sam i JclSysInfo unit... [ protector1990 @ 20.04.2006. 16:50 ] @
Onaj attachment je corrupt-ovan, a ona funkcija ne radi. Mozda sam i ja nesto pogresio, poogledaj da li valja ovaj 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. To je, kao sto vidis, celokupni kod. [ Srki_82 @ 20.04.2006. 17:48 ] @
Mogu li da pitam samo jednu sitnicu... kako znas da ne radi?
[ protector1990 @ 20.04.2006. 19:59 ] @
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?
[ reiser @ 20.04.2006. 20:13 ] @
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: 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; 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; Ne zaboravi da u uses listu dodas TlHelp32 unit. [Ovu poruku je menjao reiser dana 20.04.2006. u 21:15 GMT+1] Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|