Option Explicit
'-------------------------------------------------------
'CONSTANTES
'-------------------------------------------------------
Private Const TH32CS_SNAPMODULE As Long = &H8 'modules du processus
'-------------------------------------------------------
'APIs
'-------------------------------------------------------
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccessas As Long, ByVal bInheritHandle As Long, ByVal dwProcId As Long) As Long
Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, lProcessID As Long) As Long
Private Declare Function CreateToolhelp32Snapshot Lib "kernel32.dll" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Declare Function GetCurrentProcess Lib "kernel32.dll" () As Long
Private Declare Function Module32First Lib "kernel32.dll" (ByVal hSnapshot As Long, ByRef lppe As MODULEENTRY32) As Long
Private Declare Function Module32Next Lib "kernel32.dll" (ByVal hSnapshot As Long, ByRef lpme As MODULEENTRY32) As Long
'-------------------------------------------------------
'TYPES ET ENUMS
'-------------------------------------------------------
Public Type MODULEENTRY32
dwSize As Long 'taille de cette structure (à initialiser avant l'appel à Module32First ou Module32Next)
th32ModuleID As Long 'ID du module
th32ProcessID As Long 'ID du processus qui utilise le module
GlblcntUsage As Long 'compteur d'usage global pour toutes les instances présentes dans la mémoire du système
ProccntUsage As Long 'commteur d'usage du module pour le processus
modBaseAddr As Long 'adresse de début du module en mémoire
modBaseSize As Long 'taille du module en mémoire
hModule As Long 'HMODULE du module
szModule As String * 256 'nom du module
szExeFile As String * 260 'path du module
End Type
'-------------------------------------------------------
'créé une liste des modules d'un processus
'-------------------------------------------------------
Public Sub CreateModuleList(ByVal PID As Long, ByRef mdList() As MODULEENTRY32)
Dim lSnap As Long
Dim x As Long
Dim mdMOD As MODULEENTRY32
Dim mdTemp() As MODULEENTRY32
x = 0
'création du snapshot des modules
lSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID)
mdMOD.dwSize = Len(mdMOD)
's'occupe du premier module rencontré dans le snap
If Module32First(lSnap, mdMOD) Then
'alors on a trouvé un module, on va pouvoir continuer plus loin
'on dimensionne notre tableau
ReDim mdTemp(0)
'on stocke les infos du premier module dans la liste, à l'emplacement 0
mdTemp(0) = mdMOD
mdMOD.dwSize = Len(mdMOD)
'continue tant qu'il y a des nouveaux modules dans le snapshot
Do While Module32Next(lSnap, mdMOD)
'on redimensionne le tableau de 1 plus grand, pour pouvoir acceullir la liste temporaire du module en cours
ReDim Preserve mdTemp(x)
'formatage des strings directement dans cette Sub (car ces infos ne servent qu'à l'affichage direct)
mdMOD.szExeFile = FormatedString(mdMOD.szExeFile)
mdMOD.szModule = FormatedString(mdMOD.szModule)
'les autres infos sont des Long, donc pas de formatage
'stocke les infos du module en cours à l'emplacement x
mdTemp(x) = mdMOD
'prépare la taille pour le prochain module
mdMOD.dwSize = Len(mdMOD)
x = x + 1
Loop
Else
ReDim mdTemp(1)
End If
ReDim Preserve mdTemp(UBound(mdTemp()) - 1)
'stockage de la liste des modules
mdList = mdTemp 'on aurait directement pu travailler sur mdList sans passer par mdTemp, mais il est plus propre de ne changer mdList (d'ailleurs toute autre valeur renvoyée par une sub/fonction) uniquement A LA FIN de cette sub/fonction
'on le handle du snap
CloseHandle lSnap
End Sub
'-------------------------------------------------------
'formatage de string
'-------------------------------------------------------
Public Function FormatedString(ByVal sString As String) As String
Dim s As String
s = sString
'enlève le vbnullchar de fin si nécessaire
If InStr(s, vbNullChar) Then s = Left$(s, InStr(s, vbNullChar) - 1)
'enlève les espaces inutiles
s = Trim$(s)
FormatedString = s
End Function
Seul les admins et l'auteur du code lui même peuvent modifier ce code.