Newsgroup: it.comp.lang.delphi
Titolo: Eseguire un processo e terminarlo

Ciao a tutti.
Ho necessità, avviando la mia applicazione di eseguire un programma esterno
(una tastiera virtuale per il data entry delle informazioni).
Al termine della mia applicazione necessito però di verificare se il
processo è ancora attivo ed eventualmente di terminarlo, in modo che
l'Utente non necessiti di dover chiudere separatamente la tastiera. Non ho
trovato documentazione al riguardo, ma immagino sia qualcosa di fattibile.
Inoltre, trattandosi di un altro programma, in teoria non è escluso che sia
già in esecuzione quando l'Utente avvia la mia applicazione. In questo caso
non c'è problema in quanto mi viene fornito un messaggio di errore ad
indicare che l'applicazione è già in esecuzione. Se possibile vorrei però
riuscire a capire se l'applicazione è già in esecuzione prima ancora di
tentare di eseguirla, soltanto appunto per evitare il messaggio all'Utente.
Ringrazio anticipatamente.
Gianluca.


Mars University: «Knowledge brings Fear»

Tenuto conto che eseguire non è un problema...io ho rsolto una necessita
simile con queste due procedure, la killtask presa da torry, la
istaskrunning, è la stessa dell'uccisiono, leggermente modificata.
Entrambe le procedure lavorano passando come parametro il nome
dell'eseguibile.
Essendo io MOLTO niubbone, non ho capito molto bene come funzionano, quindi
se qualcuno si sentisse in dovere di intervenire...
Allego il codice.
ZioGian
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;
function IsTaskRunning(ExeFileName: string): boolean;
const
 PROCESS_TERMINATE=$0001;
var
 ContinueLoop: BOOL;
 FSnapshotHandle: THandle;
 FProcessEntry32: TProcessEntry32;
begin
 result := false;
 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));
     result := true;
     ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
 end;
 CloseHandle(FSnapshotHandle);
end;


"Gianluca Plevani" ha scritto nel messaggio
[cut]
Ringraziando per i suggerimenti che sono stati un ottimo punto di partenza
per miei ulteriori approfondimenti, propongo questo link veramente valido.
http://www.programmazione.it/index.php?entity=earticle&idArticle=224&idArea=1
Gianluca.