Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako pomocu delphi7 zarvoriti proces?

[es] :: Pascal / Delphi / Kylix :: Kako pomocu delphi7 zarvoriti proces?

[ Pregleda: 2118 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

protector1990

Član broj: 92159
Poruke: 10
212.62.51.*



Profil

icon Kako pomocu delphi7 zarvoriti proces?19.04.2006. u 22:19 - pre 219 meseci
Pokusavam da pomocu Delphi-a 7 zatvorim proces explorer, ali jednostavno nemam predstavu kako to da uradim. Da li neko moze da pomogne?
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2739



+92 Profil

icon Re: Kako pomocu delphi7 zarvoriti proces?20.04.2006. u 09:42 - pre 219 meseci
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.
 
Odgovor na temu

Miloš Baić
Miloš Baić
ERP (Dynamics NAV) programer
Beograd

Član broj: 72468
Poruke: 1155
*.dialup.neobee.net.



Profil

icon Re: Kako pomocu delphi7 zarvoriti proces?20.04.2006. u 11:56 - pre 219 meseci
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...
Someone's sitting in the shade today because someone planted a tree a long time ago.
Prikačeni fajlovi
 
Odgovor na temu

protector1990

Član broj: 92159
Poruke: 10
212.62.51.*



Profil

icon Re: Kako pomocu delphi7 zarvoriti proces?20.04.2006. u 16:50 - pre 219 meseci
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.
 
Odgovor na temu

Srki_82
Srdjan Tot
Me @ My Home
Ljubljana

Član broj: 28226
Poruke: 1403
82.208.201.*

ICQ: 246436949


+10 Profil

icon Re: Kako pomocu delphi7 zarvoriti proces?20.04.2006. u 17:48 - pre 219 meseci
Mogu li da pitam samo jednu sitnicu... kako znas da ne radi?
 
Odgovor na temu

protector1990

Član broj: 92159
Poruke: 10
212.62.51.*



Profil

icon Re: Kako pomocu delphi7 zarvoriti proces?20.04.2006. u 19:59 - pre 219 meseci
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?
 
Odgovor na temu

reiser

Član broj: 7895
Poruke: 2314



+102 Profil

icon Re: Kako pomocu delphi7 zarvoriti proces?20.04.2006. u 20:13 - pre 219 meseci
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]
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Kako pomocu delphi7 zarvoriti proces?

[ Pregleda: 2118 | Odgovora: 6 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.