Newsgroup: it.comp.lang.delphi
Titolo: trovare il nome di un processo a partire dall'ID

avrei bisogno di conoscere il nome di un processo in esecuzione con un
determinato PID (sempre che ci sia un processo in esecuzione con quel PID).
esiste una funzione che mi possa essere utile?

esiste una funzione che mi possa essere utile?
I processi non hanno nome....forse intendi il path dell'eseguibile che lo ha
lanciato.
Le soluzioni sono 2 :
A (e semplice) - Utilizzi le API ToolHelp32 dichiarate nella tlhelp32.pas e
fai un ciclo su tutti i processi, poi prendi il path del processo che ha il
PID uguale al tuo!
B (e + difficile) - Inietti un Hook nel processo di cui possiedi il PID e da
la richiami la GetModuleFileName.
Se vuoi esempi pratici chiedi pure!
Bye
--
- Carlo -
BSSoftware Tips Mailing-List Support

 esiste una funzione che mi possa essere utile?
ora non mi sovviene.
Ma vuoi sapere il nome dell'exe associato al processo ?
Se si, potresti fare una cosa non molto elegante ma funzionale.
Gli inietti un hook nello spazio di indirizzamento e poi con una semplice
api ottieni il nome dell'exe associato a quel processo.
Ti saluto....ciao !!
Antonio Tarolla

 Se vuoi esempi pratici chiedi pure!
approfitto della disponibilità ;)
ho una funzione che legge da un file il PID che mi interessa (1284, per
esempio) e lo memorizza in una variabile pid: String. ora ho bisogno che la
funzione mi restituisca un valore booleano positivo nel caso ci sia in
esecuzione un processo col PID contenuto nella variabile il cui nome inizi
per 'pippo' oppure un valore negativo in ogni altro caso. nello specifico,
se l'applicazione 'pippone-v4.exe' è in esecuzione con PID 1284, la funzione
deve restituirmi True.

deve restituirmi True.
Function Processo ( PID : dWord ) : String;
var hSnapshot : THandle;
    EProcess : TProcessEntry32;
    NotLast : Boolean;
begin
Result := '';
hSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
If hSnapShot<>-1 then
   begin
     NotLast:=Process32First(hSnapShot,EProcess);
     While Notlast do
     begin
       If PID = EProcess.th32ProcessID Then
       begin
         Result := EProcess.szExeFile;
         NotLast := False;
       End
       else
         NotLast:=Process32Next(hSnapShot,EProcess);
     end;
   end;
   CloseHandle(hSnapShot);
end;
NB : Includi la unit TlHelp32
Questa funzioncina che ti ho scritto va a vedere se esiste un processo che
abbia come PID quello che gli passi come parametro, se esiste ti ritorna il
nome del processo, altrimenti ritorna una stringa nulla! Se il tuo PID è in
una stringa fai prima la conversione (o se meglio credi modifica la
funzione).
Ciao


 If hSnapShot<>-1 then
come mai compilando questa linea mi dice 'Comparing signed and unsigned
types - widened both operands' e 'Comparison always evaluates to True'?


types - widened both operands' e 'Comparison always evaluates to True'?
var i : integer ;
i := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if ( i <> -1 ) then hSnapShot := THandle( i ) ;
--
Andrea Laforgia (
andrea_...@bigfoot.com
)
---------------------------------------------
#exclude <windows.h>

 if ( i <> -1 ) then hSnapShot := THandle( i ) ;
meglio usare un Cardinal al posto dell'intero e non preoccuparsi di castarlo
a THandle...
L'hint del compilatore è dovuto al fatto che un cardinal non può essere
negativo, quindi non ha senso chiedersi se è diverso da -1 : lo sarà
sempre...
invece di -1 il risultato della CreateToolHelp32Snapshot va confrontato con
$FFFFFFFF (o MAXINT se preferite)
Ciao :-)
--
(¯`·.¸¸.·´¯`·.¸¸.-> Andrea <-.¸¸.·´¯`·.¸¸.·´¯)
AntiSpam: rimuovere il trattino basso dall'indirizzo per rispondere
AntiSpam: remove the underscore from the e-mail address to reply

sempre...
A mio avviso no.
La funzione in questione restituisce -1 in caso di errore e non e'
logicamente corretto confrontarlo con un Cardinal, visto che
quest'ultimo accetta solo valori non negativi.

 quest'ultimo accetta solo valori non negativi.
Guarda, se ne era già parlato: per esempio la MessageBeep(-1) che ho usato
personalmente spesso in passato, con D4 diventa MessageBeep( $FFFFFFFF );
è anche abbastanza logico...
Cmq con D4 il prototipo della funzione (sebbene nella unit tlHelp32 ritorni
un THandle ) restituisce un Cardinal. Penso che vengano tradotti al volo da
Delphi stesso.
Anche quando lui ti dice "Widened both operands" credo che porti entrambi in
un tipo signed ( forse un int64 ).
Sta di fatto che io non lascerei quel codice col -1 : non avrai mai un
controllo di errore decente così.
Ciao


controllo di errore decente così.
Io invece credo che il controllo sia da fare proprio in quel modo.

 Io invece credo che il controllo sia da fare proprio in quel modo.
Beh, Borland sembra essere dalla mia parte... ;-)
Oh, 'mazza se sei cocciuto! :-)
