• 6 odgovora
  • 3.418 pregleda
Kako pomocu delphi7 zarvoriti proces? 19.04.2006. u 22:19 · pre 249 meseci #1
Pokusavam da pomocu Delphi-a 7 zatvorim proces explorer, ali jednostavno nemam predstavu kako to da uradim. Da li neko moze da pomogne?
Re: Kako pomocu delphi7 zarvoriti proces? 20.04.2006. u 09:42 · pre 249 meseci #2
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
Re: Kako pomocu delphi7 zarvoriti proces? 20.04.2006. u 11:56 · pre 249 meseci #3
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...
Potpis
Someone's sitting in the shade today because someone planted a tree a long time ago.
Re: Kako pomocu delphi7 zarvoriti proces? 20.04.2006. u 16:50 · pre 249 meseci #4
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.
Re: Kako pomocu delphi7 zarvoriti proces? 20.04.2006. u 19:59 · pre 249 meseci #6
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?
Re: Kako pomocu delphi7 zarvoriti proces? 20.04.2006. u 20:13 · pre 249 meseci #7
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]
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme