[ 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?
[ 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]