Тотальная неудачница и убийца жёстких дисков.
#post-id: 2794-22-17
#original-date: 20.03.2008 Thu
#original-time: 10:17 PM
#original-day:  2794
#original-host: WinXP Prof SP2 (Build 2600)

Получение списка загруженных модулей в текущем процессе. Этот код наконец унифицирует окно "О программе" моих программ в Windows 9x и Windows NT. А то у меня используются Tool Help функции, а в WinNT4 их нет... В результате вкладка с модулями просто не показывается.

Option Explicit

Type MODULEINFO
 lpBaseOfDll As POINTER
 SizeOfImage As Long
 EntryPoint As POINTER
End Type

' API_HANDLE = Long
' C_BOOL = Long
' POINTER = Long
' BStr = String

Declare Function EnumProcesses Lib "PSAPI.DLL" _
                        (ByRef pProcessIds As Long, _
                         ByVal cb As Long, _
                         ByRef pBytesReturned As Long) As C_BOOL
Declare Function EnumProcessModules Lib "PSAPI.DLL" _
                        (ByVal hProcess As API_HANDLE, _
                         ByRef lphModule As API_HANDLE, _
                         ByVal cb As Long, _
                         ByRef lpcbNeeded As Long) As C_BOOL
Declare Function GetModuleBaseName Lib "PSAPI.DLL" Alias "GetModuleBaseNameA" _
                        (ByVal hProcess As API_HANDLE, _
                         ByVal hModule As API_HANDLE, _
                         ByVal lpBaseName As BStr, _
                         ByVal nSize As Long) As Long
Declare Function GetModuleFileNameEx Lib "PSAPI.DLL" _
                         Alias "GetModuleFileNameExA" _
                        (ByVal hProcess As API_HANDLE, _
                         ByVal hModule As API_HANDLE, _
                         ByVal lpFileName As BStr, _
                         ByVal nSize As Long) As Long
Declare Function GetModuleInformation Lib "PSAPI.DLL" _
                        (ByVal hProcess As API_HANDLE, _
                         ByVal hModule As API_HANDLE, _
                         ByRef lpmodinfo As MODULEINFO, _
                         ByVal cb As Long) As C_BOOL

'====================================================================
Public Sub Main()
 Const MAX_MODS = 2048
 
 Dim hProcess As API_HANDLE
 Dim RC As Long
 Dim hMod(0 To MAX_MODS - 1) As API_HANDLE
 Dim cbNeeded As Long
 Dim TMP As Long
 Dim ModuleName As BStr
 Dim MI As MODULEINFO
 
 hProcess = GetCurrentProcess()
 
 RC = EnumProcessModules(hProcess, hMod(0), MAX_MODS * 4, cbNeeded)
 If RC = 0 Then
   MsgBox "Can't enum process modules!", vbCritical
 Else
   For TMP = 0 To (cbNeeded / 4) - 1
     ModuleName = String(1025, 0)
     GetModuleFileNameEx hProcess, hMod(TMP), ModuleName, 1024
     ModuleName = asGetStringFromPointerA(ModuleName)
     
     Debug.Print ModuleName
     
     RC = GetModuleInformation(hProcess, hMod(TMP), MI, Len(MI))
     If RC <> 0 Then
       Debug.Print asHexEx4(MI.lpBaseOfDll) & "  " _
                   asHexEx4(MI.EntryPoint) & "  " & _
                   asFormatUnsignedLong(MI.SizeOfImage)
     End If
   Next TMP
 End If
End Sub



Код не работает в Win9x. Вообще-то есть версия PSAPI.DLL для Windows 95, но она весит четыре кило, так что выводы делайте сами ^^

#music: Initial D\Initial D D Selection\Mega NRG Man / Get Me Power