Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: Fabio - Novembre 25, 2011, 03:43:35 pm

Titolo: Terminare un processo
Inserito da: Fabio - Novembre 25, 2011, 03:43:35 pm
Qualche consiglio su come terminare un processo attivo?
Ho visto che esiste un KillThread ma non trovo molta documentazione su come usarlo.

Si può anche avere una lista dei processi attivi per caso?

Se possibile che sia cross ma l'utilità di adesso è solo su Windows.

Grazie.
Titolo: Re:Terminare un processo
Inserito da: xinyiman - Novembre 25, 2011, 04:12:04 pm
Guarda se questo può esserti d'aiuto!

http://www.freepascal.org/docs-html/prog/progse44.html
Titolo: Re:Terminare un processo
Inserito da: Fabio - Novembre 25, 2011, 04:18:22 pm
Hum da quello che leggo allora il KillThread non è quello che fa per me, mi sa si riferisce a una programmazione multi-thread e non a killare un processo esterno avviato ( es. THUNDERBIRD.EXE )

Perchè su Windows mi aggiusto semmai richiamando l'esecuzione del TASKKILL ma se c'era un qualcosa di interno preferivo.
Titolo: Re:Terminare un processo
Inserito da: xinyiman - Novembre 25, 2011, 04:42:24 pm
Ho trovato questo, ma non è molto incoraggiante!

http://www.lazarus.freepascal.org/index.php?topic=3543.0
Titolo: Re:Terminare un processo
Inserito da: Legolas - Novembre 25, 2011, 04:53:33 pm
Prova a fare così: aggiungi windows e jwatlhelp32 agli uses, quindi utilizza questa funzione:

Codice: [Seleziona]
function KillTask(ExeFileName: string): integer;
const
 PROCESS_TERMINATE=$0001;
var
 ContinueLoop: BOOL;
 FSnapshotHandle: THandle;
 FProcessEntry32: TProcessEntry32;
begin
 result := 0;

 FSnapshotHandle := CreateToolhelp32Snapshot
           (TH32CS_SNAPPROCESS, 0);
 FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
 ContinueLoop := Process32First(FSnapshotHandle,
                 FProcessEntry32);

 while integer(ContinueLoop) <> 0 do
 begin
  if ((UpperCase(ExtractFileName(
            FProcessEntry32.szExeFile)) =
     UpperCase(ExeFileName)) or
    (UpperCase(FProcessEntry32.szExeFile) =
     UpperCase(ExeFileName))) then

   Result := Integer(TerminateProcess(OpenProcess(
            PROCESS_TERMINATE, BOOL(0),
            FProcessEntry32.th32ProcessID), 0));

  ContinueLoop := Process32Next(FSnapshotHandle,
                 FProcessEntry32);
 end;

 CloseHandle(FSnapshotHandle);
end;

Puoi chiamare la funzione così:

Codice: [Seleziona]
KillTask('notepad.exe'); 

Testato ora su XP e funziona
Titolo: Re:Terminare un processo
Inserito da: Fabio - Novembre 28, 2011, 02:09:20 pm
La procedura funziona perfettamente.

Grazie.