Da enumprocesses code

Contenu du snippet

Je suis en train de travailler sur un programme de surveillance des processus. Dans ce cadre j'ai cherché sur le net comment énumérer les processus.
J'ai constaté que le même code tourne sur le net (VBFrance entre-autre). La plupart des gens s'en approprient l'origine, et ce qui est assez burlesque
dans cette histoire c'est que le code proposé est assez maladroit ou ne propose qu'une simple traduction des commentaires de la source d'AllAPI.net .

Il n'est pas rare d'ailleurs que l'on y trouve des variables déclarées ne servant pas, des fonctions API employées n'apportant rien, ce qui montre à quel point le copier/coller n'est pas source de compréhension.

Voici donc un vrai travail d'analyse sur l'emploi de la fonction EnumProcesses, avec une réduction de la routine d'environ la moitié de ce que proposent les autres sources.

J'ai essayé de mettre un maximum de commentaires pour que chacun puisse s'y retrouver.

Je ne dis pas que cette source est meilleure qu'une autre, mais en tout cas, je suis certains qu'elle apportera en compréhension à tous ceux qui souhaitent vraiment savoir comment l'utiliser et pas simplement s'attribuer le mérite de l'avoir décryptée sans même la comprendre.

En conclusion: le but n'est pas tant de s'attribuer le travail des autres, mais de le perfectionner afin que cela puisse profiter à tout le monde.

Source / Exemple :


' fonction permettant d'énumérer les processus
Private Declare Function _
EnumProcesses Lib "PSAPI.DLL" (ByRef _
    tableau_process As Long, ByVal taille_tableau_supposee As Long, _
    ByRef taille_tableau_reelle As Long) As Long
    
' fonction permettant d'ouvrir les processus
Private Declare Function _
OpenProcess Lib "Kernel32.dll" (ByVal _
    acces_desire As Long, _
    ByVal heritage_handle As Long, _
    ByVal handle_process As Long) As Long

' fonction permettant de connaître le nom d'un processus dont on connait le handle
Private Declare Function _
GetModuleFileNameExA Lib "PSAPI.DLL" (ByVal _
    handle_process_ouvert As Long, _
    ByVal handle_module As Long, ByVal _
    nom_processus As String, _
    ByVal taille As Long) As Long
    
' fonction permettant de fermer un handle de processus
Private Declare Function _
CloseHandle Lib "Kernel32.dll" (ByVal _
    handle_process_ouvert As Long) As Long

' variable pour openprocess, permet de consulter le nom des processus
Private Const PROCESS_VM_READ = 16
Private Const PROCESS_QUERY_INFORMATION = 1024

' initialisation des variables
Dim taille_tableau_supposee As Long
Dim taille_tableau_reelle As Long
Dim nb_process As Long
Dim tableau_process() As Long
Dim nom_processus As String
Dim taille As Long
Dim handle_process_ouvert As Long
Dim item As Long

  
  
  
Sub Form_Load()

' on suppose qu'il y a maximum 250 processus en cours
ReDim tableau_process(250) As Long

' dimensions en octets du tableau (4 octets par procesus, soit 1000 octets)
taille_tableau_supposee = 1000

'passe la fonction EnumProcess pour remplir le tableau des de processus et en connaître la taille reelle
EnumProcesses tableau_process(1), taille_tableau_supposee, taille_tableau_reelle

'Compte les processus (4 octets par processus, il y a donc 4 fois moins de handle que le nombre
'contenu dans taille_reelle
nb_process = taille_tableau_reelle / 4

'passe en revu tous les handles  de processus pour en obtenir le nom
For item = 1 To nb_process
        DoEvents
        'Donne le handle du processus et l' ouvre
        handle_process_ouvert = OpenProcess(PROCESS_QUERY_INFORMATION + PROCESS_VM_READ, 0, tableau_process(item))
        If handle_process_ouvert <> 0 Then
                'initialise un buffer pour recevoir le nom du processus
                nom_processus = Space(250)
                taille = 250
                'Prend le nom du processus, cette fonction renvoi le nb de caractère du nom , d'où l'utilisation de la variable taille réelle
                taille_reelle = GetModuleFileNameExA(handle_process_ouvert, 0, nom_processus, taille)
                'Enlève les espaces
                nom_module = Left(nom_module, taille_reelle)
        End If
'Ferme les handles du processus
CloseHandle handle_process_ouvert

'ajoute à une liste le processus en cours ainsi que son handle (appelé PID dans le gestionnaire des tâches)
List1.AddItem nom_module & " " & tableau_process(item)
Next

End Sub

Conclusion :


Comme d'hab, je vous invite à venir faire un p'tit tour sur API @ la Loupe
http://xav.prog.power.free.fr

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.