Savoir si un processus est en cours


Propriétés du code


Date de création : 12/11/2006 à 21:01:00
5 Commentaire(s)
  sebdraluorg

 

Présentation


Le code est tres simple, on tente d'ouvrir le process, si erreur le process n'est pas en cours,
sinon on verifie quand meme qu'il soit bien en cours (STILL_ACTIVE)
car si il vient d'etre fermé son pid est tjs disponible (je sais pas combien de temps)

 

Code


Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const PROCESS_QUERY_INFORMATION As Long = &H400

Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
Private Const STILL_ACTIVE = &H103



Public Function IsProcessRunning(ByVal pid As Long) As Boolean

    Dim hProcess As Long
    Dim lngExit As Long
    
    If pid = 0 Then IsProcessRunning = True: Exit Function
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0&, pid)
    If hProcess = 0 Then Exit Function
    GetExitCodeProcess hProcess, lngExit
    CloseHandle hProcess
    If lngExit = STILL_ACTIVE Then IsProcessRunning = True
    
End Function


 
 

Modifier le code

Seul les admins et l'auteur du code lui même peuvent modifier ce code.

 

Commentaires


De MadMatt le 13/11/2006 à 13:26


Salut seb,
la valeur par défaut pour un booléen c'est False ? parce que à aucun moment dans ta fonction y'a IsProcessRunning=False, donc je pense que c'est sous entendu mais c pour etre sur ?

Content que tu sois la sinon ^^

 

De sebdraluorg le 13/11/2006 à 17:40


Salut Mad ;)

Oui en effet un Booléen est toujours a false par défaut (du moins en vb6)

 

De violent_ken le 02/01/2007 à 00:59


J'ai une question : si l'on n'a pas les droits (privilege DEBUG) pour accéder aux processus systèmes, OpenProcess renvoie 0 même si le processus est actif, non ?

@+

 

De sebdraluorg le 02/01/2007 à 18:19


Yep en effet cette methode requert le privilege debug pour les services reseau et local.

Il serait surement preferable d'utiliser une autre methode et de garder celle-ci pour les process dont on a deja le Handle...

Je vais refaire une via NtQuerrySystemInformation ca devrait relativement rapide aussi..

Merci pour la remarque j'y avais pas pensé ;)

++

 

De sebdraluorg le 02/01/2007 à 20:32


tout compte fait non, j'avais pas pensé mais on peut simplement utiliser LastDllError si hProcess = 0

donc suffit juste d'ajouter:
If hProcess = 0 Then
IsProcessRunning = (Err.LastDllError = 5&)
Exit Function
End If

Et ca marche avec tous les process.

J'vais mettre le code a jour...

++

 

Ajouter un commentaire


Vous devez être connecté pour pouvoir poster un commentaire.

 
 

Valid HTML 4.01 Transitional Valid CSS

Site web de Vb System Library version 1.3
Developpement et design réalisé par : Matthieu Napoli (MadMatt)
© 2007 Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
Temps d'execution de la page : 0.014 s
www.mnapoli.fr