贴一个函数玩玩,大家也算共享下

dongge2000 2004-10-30 08:03:21
Option Explicit
Private Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hProcess As Long, hModule As Long, ByVal cb As Long, cbNeeded As Long) As Long
Private Declare Function GetModuleBaseName Lib "PSAPI.DLL" Alias "GetModuleBaseNameA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpBaseName As String, ByVal nSize As Long) As Long
Private Declare Function GetModuleFileNameEx Lib "PSAPI.DLL" Alias "GetModuleFileNameExA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long

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_VM_READ = &H10
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const MAX_PATH = 260

'模 块 名:EnumModule
'功 能:读出一个进程中所有的模块名和模块路径(第一个就是程序本身的路径)
'返 回 值:暂无(大家也可以写入错误处理)
'参 数:EnumModule(进程的标识符,读出的模块数组)
'调用方法:(Form1、Command1、Text1、List1)各一个
'Private Sub Command1_Click()
'Dim Arr() As String
'EnumModule CLng(Text1.Text), Arr
'Dim i
'For Each i In Arr
'List1.AddItem i
'Next
'MsgBox List1.ListCount
'End Sub
Public Function EnumModule(ByVal hProc As Long, ByRef sModule() As String) As Long
Dim lRet As Long '返回值
Dim i As Long '循环计数器
Dim hProcess As Long '进程标识
Dim hModule() As Long '进程中的所有模块
Dim ModName As String '模块名
Dim ModFilePath As String '模块路径
Dim cbNeed As Long '偶也不知是做什么的,好像是计录进程中的模块数量cbNeed / 4

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0&, hProc)
ReDim hModule(1) As Long
lRet = EnumProcessModules(hProcess, hModule(1), 1, cbNeed)
ReDim hModule(1 To cbNeed / 4) As Long
lRet = EnumProcessModules(hProcess, hModule(1), cbNeed, cbNeed)

For i = 1 To cbNeed / 4
If hModule(i) Then
ModName = String(MAX_PATH, 0)
GetModuleBaseName hProcess, hModule(i), ModName, Len(ModName)
ModName = Left(ModName, InStr(1, ModName, Chr(0)) - 1)

ModFilePath = String(MAX_PATH, 0)
GetModuleFileNameEx hProcess, hModule(i), ModFilePath, Len(ModFilePath)
ModFilePath = Left(ModFilePath, InStr(1, ModFilePath, Chr(0)) - 1)
ReDim Preserve sModule(i - 1) As String
sModule(i - 1) = ModName & "=" & ModFilePath
End If
Next
CloseHandle hProcess
End Function
...全文
389 29 打赏 收藏 转发到动态 举报
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQRN 2004-11-02
  • 打赏
  • 举报
回复
我顶……
wsyyq 2004-11-02
  • 打赏
  • 举报
回复
不懂,顶。
flisun 2004-11-02
  • 打赏
  • 举报
回复
我是地球人
还是看不懂
dongge2000 2004-11-02
  • 打赏
  • 举报
回复
连viena都看不懂?我不是地球人吗?
dongge2000 2004-11-02
  • 打赏
  • 举报
回复
晕,看不懂我结贴了,失败ing
yingxiangchen 2004-11-02
  • 打赏
  • 举报
回复
偶看了半天也不明白是什么意思!能告訴我是做啥的嗎?呵呵!還是頂一下吧!
MY2000 2004-11-02
  • 打赏
  • 举报
回复
Option Explicit
Private Declare Function EnumProcessModules Lib "PSAPI.DLL" (ByVal hProcess As Long, hModule As Long, ByVal cb As Long, cbNeeded As Long) As Long
Private Declare Function GetModuleBaseName Lib "PSAPI.DLL" Alias "GetModuleBaseNameA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpBaseName As String, ByVal nSize As Long) As Long
Private Declare Function GetModuleFileNameEx Lib "PSAPI.DLL" Alias "GetModuleFileNameExA" (ByVal hProcess As Long, ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long

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_VM_READ = &H10
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const MAX_PATH = 260
'模 块 名:EnumModule
'功 能:读出一个进程中所有的模块名和模块路径(第一个就是程序本身的路径)
'返 回 值:暂无(大家也可以写入错误处理)
'参 数:EnumModule(进程的标识符,读出的模块数组)
'调用方法:(Form1、Command1、Text1、List1)各一个
'Private Sub Command1_Click()
'EnumModule CLng(Text1.Text), List1
'End Sub
Public Function EnumModule(ByVal hProc As Long, ByRef sList As ListBox) As Long
Dim lRet As Long '返回值
Dim i As Long '循环计数器
Dim hProcess As Long '进程标识
Dim hModule() As Long '进程中的所有模块
Dim ModName As String '模块名
Dim ModFilePath As String '模块路径
Dim cbNeed As Long '偶也不知是做什么的,好像是计录进程中的模块数量cbNeed / 4

hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ, 0&, hProc)
ReDim hModule(1) As Long
lRet = EnumProcessModules(hProcess, hModule(1), 1, cbNeed)
ReDim hModule(1 To cbNeed / 4) As Long
lRet = EnumProcessModules(hProcess, hModule(1), cbNeed, cbNeed)
sList.Clear
For i = 1 To cbNeed / 4
If hModule(i) Then
ModName = String(MAX_PATH, 0)
GetModuleBaseName hProcess, hModule(i), ModName, Len(ModName)
ModName = Left(ModName, InStr(1, ModName, Chr(0)) - 1)

ModFilePath = String(MAX_PATH, 0)
GetModuleFileNameEx hProcess, hModule(i), ModFilePath, Len(ModFilePath)
ModFilePath = Left(ModFilePath, InStr(1, ModFilePath, Chr(0)) - 1)
sList.AddItem ModName & "=" & ModFilePath
End If
Next
CloseHandle hProcess
End Function
===========================
这个够傻瓜化了,调用就一句。
MY2000 2004-11-02
  • 打赏
  • 举报
回复
楼上能说一下为什么不能用吗?
efengxu 2004-11-02
  • 打赏
  • 举报
回复
不能用,不能用!
longki 2004-11-02
  • 打赏
  • 举报
回复

cbNeed没有什么初值吗?
hgh06 2004-11-02
  • 打赏
  • 举报
回复
顶就顶
yuantou520 2004-11-02
  • 打赏
  • 举报
回复
sssss342072 2004-11-02
  • 打赏
  • 举报
回复
这个函数看功能真是不错,看其他人程序就方便多了。不知道效果怎摸样,是傻瓜型的吗?hProc和
sModule() 传进来的这两个是作身摸的?
傻瓜型就好了~~

回帖啊~!!不懂就要顶

回帖
sandy_zhang 2004-11-01
  • 打赏
  • 举报
回复
up
libralibra 2004-11-01
  • 打赏
  • 举报
回复
导师说:“看不懂的贴子是好贴!要顶”

我说:“看不懂的帖子就是难贴!更要顶”
viena 2004-11-01
  • 打赏
  • 举报
回复
看不懂,
好贴!
顶一下
dongge2000 2004-11-01
  • 打赏
  • 举报
回复
分少大家就不顶了?
feng1net 2004-10-31
  • 打赏
  • 举报
回复
学习。。。。。
lightdark 2004-10-31
  • 打赏
  • 举报
回复
顶一下!!
wumylove1234 2004-10-31
  • 打赏
  • 举报
回复
记下。明天去公司试验!
加载更多回复(9)

7,765

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧