用以下方法读取的进程列表显示在文本框中的错,这是为什么?
中间的分隔符"*"没了,在最后还加的几个不确定字符
捆扰我很久了,请各位帮忙 谢谢了!
Private Sub Command1_Click()
Dim i As Long, lPid As Long
Dim Proc As PROCESSENTRY32
Dim hSnapShot As Long
ListView1.ListItems.Clear '清空ListView
hSnapShot = CreateToolhelpSnapshot(TH32CS_SNAPall, 0) '获得进程“快照”的句柄
Proc.dwSize = Len(Proc)
lPid = ProcessFirst(hSnapShot, Proc) '获取第一个进程的PROCESSENTRY32结构信息数据
i = 0
Text1.Text = ""
Do While lPid <> 0 '当返回值非零时继续获取下一个进程
ListView1.ListItems.Add , "a" & i, Proc.th32ProcessID 'Hex(Proc.th32ProcessID) '将进程ID添加到ListView1第一列
ListView1.ListItems("a" & i).SubItems(1) = Proc.szExeFile '将进程名添加到ListView1第二列
i = i + 1
lPid = ProcessNext(hSnapShot, Proc) '循环获取下一个进程的PROCESSENTRY32结构信息数据
Text1.Text = Text1.Text & Proc.th32ProcessID & Proc.szExeFile & "*" '出错的地方
Loop
CloseHandle hSnapShot '关闭进程“快照”句柄
End Sub'---------------
还有一问,我在读取操作系统信息时也有这个问题.
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
osName As String
End TypeDim ver As OSVERSIONINFO
ver.szCSDVersion
得到的ver.szCSDVersion后面也有一些乱符号,用trim()也去不掉
中间的分隔符"*"没了,在最后还加的几个不确定字符
捆扰我很久了,请各位帮忙 谢谢了!
Private Sub Command1_Click()
Dim i As Long, lPid As Long
Dim Proc As PROCESSENTRY32
Dim hSnapShot As Long
ListView1.ListItems.Clear '清空ListView
hSnapShot = CreateToolhelpSnapshot(TH32CS_SNAPall, 0) '获得进程“快照”的句柄
Proc.dwSize = Len(Proc)
lPid = ProcessFirst(hSnapShot, Proc) '获取第一个进程的PROCESSENTRY32结构信息数据
i = 0
Text1.Text = ""
Do While lPid <> 0 '当返回值非零时继续获取下一个进程
ListView1.ListItems.Add , "a" & i, Proc.th32ProcessID 'Hex(Proc.th32ProcessID) '将进程ID添加到ListView1第一列
ListView1.ListItems("a" & i).SubItems(1) = Proc.szExeFile '将进程名添加到ListView1第二列
i = i + 1
lPid = ProcessNext(hSnapShot, Proc) '循环获取下一个进程的PROCESSENTRY32结构信息数据
Text1.Text = Text1.Text & Proc.th32ProcessID & Proc.szExeFile & "*" '出错的地方
Loop
CloseHandle hSnapShot '关闭进程“快照”句柄
End Sub'---------------
还有一问,我在读取操作系统信息时也有这个问题.
Private Type OSVERSIONINFO
dwOSVersionInfoSize As Long
dwMajorVersion As Long
dwMinorVersion As Long
dwBuildNumber As Long
dwPlatformId As Long
szCSDVersion As String * 128
osName As String
End TypeDim ver As OSVERSIONINFO
ver.szCSDVersion
得到的ver.szCSDVersion后面也有一些乱符号,用trim()也去不掉
Function Trim0(sText as String) as String
dim iPos as long
iPos=InStr(1, sText, vbNullChar, vbBinaryCompare)
if iPos<>0 then
Trim0 = Left$(sText, iPos - 1)
Else
Trim0=sText
end if
end funcion
http://72.14.203.104/search?q=cache:Oid6-6wMLMIJ:www.newzgc.com/bbs/showdoc.asp%3Fbid%3D10%26id%3D237%26pageno%3D1+CreateToolhelpSnapshot+vb+api+TH32CS_SNAPall&hl=zh-CN
Option Explicit
'======================用于查找进程和终止进程的API函数常数定义=====================
Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function ProcessFirst Lib "kernel32" Alias "Process32First" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function ProcessNext Lib "kernel32" Alias "Process32Next" (ByVal hSnapshot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode 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
Const MAX_PATH As Integer = 260
Private Type PROCESSENTRY32
dwsize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * MAX_PATH
End Type
Const TH32CS_SNAPheaplist = &H1
Const TH32CS_SNAPPROCESS = &H2
Const TH32CS_SNAPthread = &H4
Const TH32CS_SNAPmodule = &H8
Const TH32CS_SNAPall = TH32CS_SNAPPROCESS + TH32CS_SNAPheaplist + TH32CS_SNAPthread + TH32CS_SNAPmodule'======================在WIN2000下提升本进程权限的API函数常数定义=====================
Const STANDARD_RIGHTS_REQUIRED = &HF0000
Const TOKEN_ASSIGN_PRIMARY = &H1
Const TOKEN_DUPLICATE = (&H2)
Const TOKEN_IMPERSONATE = (&H4)
Const TOKEN_QUERY = (&H8)
Const TOKEN_QUERY_SOURCE = (&H10)
Const TOKEN_ADJUST_PRIVILEGES = (&H20)
Const TOKEN_ADJUST_GROUPS = (&H40)
Const TOKEN_ADJUST_DEFAULT = (&H80)
Const TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or TOKEN_ASSIGN_PRIMARY Or _
TOKEN_DUPLICATE Or TOKEN_IMPERSONATE Or TOKEN_QUERY Or TOKEN_QUERY_SOURCE Or _
TOKEN_ADJUST_PRIVILEGES Or TOKEN_ADJUST_GROUPS Or TOKEN_ADJUST_DEFAULT)
Const SE_PRIVILEGE_ENABLED = &H2
Const ANYSIZE_ARRAY = 1
Private Type LUID
lowpart As Long
highpart As Long
End Type
Private Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As Long
End Type
Private Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function LookupPrivilegeValue Lib "advapi32.dll" Alias "LookupPrivilegeValueA" (ByVal lpSystemName As String, ByVal lpName As String, lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32.dll" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, NewState As TOKEN_PRIVILEGES, ByVal BufferLength As Long, PreviousState As TOKEN_PRIVILEGES, ReturnLength As Long) As Long
Private Declare Function OpenProcessToken Lib "advapi32.dll" (ByVal ProcessHandle As Long, ByVal DesiredAccess As Long, TokenHandle As Long) As Long
'======================用于查找进程的版本信息的API函数常数定义=====================
Private Declare Function Module32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As MODULEENTRY32) As Long
Private Declare Function Module32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As MODULEENTRY32) As Long
Private Type MODULEENTRY32
dwsize As Long
th32ModuleID As Long
th32ProcessID As Long
GlblcntUsage As Long
ProccntUsage As Long
modBaseAddr As Byte
modBaseSize As Long
hModule As Long
szModule As String * 256
szExePath As String * 1024
End TypePrivate Declare Function GetFileVersionInfo Lib "Version.dll" _
Alias "GetFileVersionInfoA" (ByVal lptstrFilename As String, _
ByVal dwhandle As Long, ByVal dwlen As Long, lpData As Any) As LongPrivate Declare Function GetFileVersionInfoSize Lib "Version.dll" _
Alias "GetFileVersionInfoSizeA" (ByVal lptstrFilename As String, _
lpdwHandle As Long) As LongPrivate Declare Function VerQueryValue Lib "Version.dll" _
Alias "VerQueryValueA" (pBlock As Any, ByVal lpSubBlock As String, _
lplpstrFileInfoString As Any, puLen As Long) As LongPrivate Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
======================用于获得进程CPU时间的API函数常数定义================ =====
Private Declare Function GetProcessTimes Lib "kernel32" (ByVal hProcess As Long, lpCreationTime As FILETIME, lpExitTime As FILETIME, lpKernelTime As FILETIME, lpUserTime As FILETIME) As Long
Private Declare Function FileTimeToSystemTime Lib "kernel32" (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long
Private Type FILETIME ' 8 Bytes
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type SYSTEMTIME ' 16 Bytes
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type
Private Const SYNCHRONIZE = &H100000
Private Const PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF
'程序加载
Private Sub Form_Load()
'以下 AdjustTokenPrivileges2000 此过程只对Win2000有用,用做提升进程权限
' AdjustTokenPrivileges2000
Me.Caption = "WINDOWS 进程管理器 — 风化专用的^_^ QQ:584327"
Command1.Caption = "刷新"
Command2.Caption = "终止进程"
Command3.Caption = "退出"
ListView1.ColumnHeaders.Clear
ListView1.ColumnHeaders.Add , , "进程名", 1600
ListView1.ColumnHeaders.Add , , "进程ID", 1200
ListView1.ColumnHeaders.Add , , "出版公司", 1800
ListView1.ColumnHeaders.Add , , "版本号", 1600
ListView1.ColumnHeaders.Add , , "路径", 3800
ListView1.ColumnHeaders.Add , , "文件创建日期", 1900
ListView1.ColumnHeaders.Add , , "大小", 1600
ListView1.ColumnHeaders.Add , , "CPU", 800
ListView1.ColumnHeaders.Add , , "CPU时间", 1600
ListView1.View = lvwReport
ListView1.FullRowSelect = True
ListView1.LabelEdit = lvwManual
Command1_Click '刷新进程列表
End SubPrivate Sub Form_Resize()
If Me.WindowState <> 1 Then
ListView1.Width = Me.Width - 300
ListView1.Height = Me.Height - 1600
Command1.Move Me.Width - 4680, Me.Height - 810
Command2.Move Command1.Left + 1560, Command1.Top
Command3.Move Command2.Left + 1560, Command1.TopEnd If
End Sub'显示当前系统中全部进程,[刷新]按钮
Private Sub Command1_Click()
Dim i As Long, lPid As Long, FileName As String, TmpStr As String, TmpLong As Long
Dim Proc As PROCESSENTRY32
Dim hSnapshot As Long
Dim Mode As MODULEENTRY32
Dim mSnapshot As Long
Dim lInfoSize As Long, arrInfo() As Byte, lpInfoBlock As Long, arrTemp(4) As Byte
Dim fs, f
Set fs = CreateObject("Scripting.FileSystemObject")
ListView1.ListItems.Clear '清空ListView
hSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPall, 0) '获得进程“快照”的句柄
Proc.dwsize = Len(Proc)
lPid = ProcessFirst(hSnapshot, Proc) '获取第一个进程的PROCESSENTRY32结构信息数据
i = 0
Do While lPid <> 0 '当返回值非零时继续获取下一个进程
'----------------在结构Proc元素szExeFile中为进程名-----------
TmpStr = Trim(Left(Proc.szExeFile, InStr(Proc.szExeFile, Chr(0)) - 1))
TmpLong = InStr(TmpStr, "\")
Do While TmpLong <> 0
TmpStr = Mid(TmpStr, TmpLong + 1)
TmpLong = InStr(TmpStr, "\")
Loop
ListView1.ListItems.Add , "a" & i, TmpStr '将进程名添加到ListView1第1列
'----------------在结构Proc元素th32ProcessID中为进程ID-----------
ListView1.ListItems("a" & i).SubItems(1) = Proc.th32ProcessID & "(&H" & Hex(Proc.th32ProcessID) & ")" '将进程ID添加到ListView1第2列
'----------------查找进程的执行程序的路径-----------------------
'通过模块快照,获得进程的模块快照句柄
mSnapshot = CreateToolhelpSnapshot(TH32CS_SNAPmodule, Proc.th32ProcessID)
If mSnapshot > 0 Then
Mode.dwsize = Len(Mode) '初始化结构mo的大小
TmpStr = Trim(Left(Proc.szExeFile, InStr(Proc.szExeFile, Chr(0)) - 1))
'用该进程第1个模块的szExePath字段,作为进程的程序路径
If Module32First(mSnapshot, Mode) And UCase(TmpStr) <> "[SYSTEM PROCESS]" Then
If InStr(UCase(Mode.szExePath), UCase(TmpStr)) Then '将加载模块的路径加入ListBox
TmpStr = Left(Mode.szExePath, InStr(Mode.szExePath, Chr(0)) - 1)
If InStr(TmpStr, ":") > 2 Then TmpStr = Mid(TmpStr, InStr(TmpStr, ":") - 1)
'进程的执行程序的路径
ListView1.ListItems("a" & i).SubItems(4) = TmpStr
Else
Do While Module32Next(mSnapshot, Mode) <> 0
If InStr(UCase(Mode.szExePath), UCase(TmpStr)) Then '将加载模块的路径加入ListBox
TmpStr = Left(Mode.szExePath, InStr(Mode.szExePath, Chr(0)) - 1)
If InStr(TmpStr, ":") > 2 Then TmpStr = Mid(TmpStr, InStr(TmpStr, ":") - 1)
'进程的执行程序的路径
ListView1.ListItems("a" & i).SubItems(4) = TmpStr
End If
Mode.szExePath = ""
Loop 'Until Module32Next(mSnapshot, Mode) = 0
End If
If ListView1.ListItems("a" & i).SubItems(4) = "" Then
Module32First mSnapshot, Mode
TmpStr = Left(Mode.szExePath, InStr(Mode.szExePath, Chr(0)) - 1)
If InStr(TmpStr, ":") > 2 Then TmpStr = Mid(TmpStr, InStr(TmpStr, ":") - 1)
'进程的执行程序的路径
ListView1.ListItems("a" & i).SubItems(4) = TmpStr
End If
End If
CloseHandle (mSnapshot) '关闭模块快照句柄
End If
'-------------------------------------------------------------------
lInfoSize = GetFileVersionInfoSize(TmpStr, 0&)
If lInfoSize > 0 Then
ReDim arrInfo(lInfoSize)
If GetFileVersionInfo(TmpStr, 0&, lInfoSize, arrInfo(0)) <> 0 Then
If VerQueryValue(arrInfo(0), "\VarFileInfo\Translation", lpInfoBlock, lInfoSize) Then
CopyMemory arrTemp(0), ByVal lpInfoBlock, lInfoSize
TmpStr = Right("00" & Hex(arrTemp(1)), 2) & Right("00" & Hex(arrTemp(0)), 2) & _
Right("00" & Hex(arrTemp(3)), 2) & Right("00" & Hex(arrTemp(2)), 2)
ListView1.ListItems("a" & i).SubItems(2) = GetInfoBlock("CompanyName", TmpStr, arrInfo, lpInfoBlock, lInfoSize)
ListView1.ListItems("a" & i).SubItems(3) = GetInfoBlock("FileVersion", TmpStr, arrInfo, lpInfoBlock, lInfoSize)
End If
End If
End If
On Error Resume Next
Set f = fs.GetFile(ListView1.ListItems("a" & i).SubItems(4))
ListView1.ListItems("a" & i).SubItems(6) = Format(f.Size / 1024 + 0.5, "##,##0.00") & "K(" & f.Size & ")"
ListView1.ListItems("a" & i).SubItems(5) = f.DateCreated
On Error GoTo 0
Dim lpCreateionTime As FILETIME, lpExitTime As FILETIME, lpKernelTime As FILETIME
Dim lpUserTime As FILETIME, CpuTime As FILETIME, SysTime As SYSTEMTIME
On Error Resume Next
TmpLong = OpenProcess(PROCESS_ALL_ACCESS, False, Proc.th32ProcessID) GetProcessTimes TmpLong, lpCreateionTime, lpExitTime, lpKernelTime, lpUserTime
CpuTime.dwHighDateTime = lpKernelTime.dwHighDateTime + lpUserTime.dwHighDateTime
CpuTime.dwLowDateTime = lpKernelTime.dwLowDateTime + lpUserTime.dwLowDateTime
FileTimeToSystemTime CpuTime, SysTime
ListView1.ListItems.Item("a" & i).SubItems(8) = (SysTime.wHour & ":" & SysTime.wMinute & ":" & SysTime.wSecond)
On Error GoTo 0
i = i + 1
lPid = ProcessNext(hSnapshot, Proc) '循环获取下一个进程的PROCESSENTRY32结构信息数据
Loop
CloseHandle hSnapshot '关闭进程“快照”句柄
End Sub
Private Function GetInfoBlock(ByVal inStringName As String, StrL As String, aInfo() As Byte, lpInfoBlock As Long, lInfoSize As Long) As String
Dim strFileInfoString As String
GetInfoBlock = ""
strFileInfoString = String(128, 0)
If VerQueryValue(aInfo(0), "\StringFileInfo\" & StrL & _
"\" & inStringName, lpInfoBlock, lInfoSize) > 0 Then
CopyMemory ByVal strFileInfoString, ByVal lpInfoBlock, 128&
GetInfoBlock = Mid(strFileInfoString, 1, InStr(strFileInfoString, vbNullChar) - 1)
End If
End Function
'终止指定进程
Private Sub Command2_Click()
Dim lPHand As Long, TMBack As Long
If ListView1.SelectedItem.Text <> "" Then
If MsgBox("确实要结束进程[" & ListView1.SelectedItem.Text & "-" & ListView1.SelectedItem.SubItems(1) & "]吗?", vbYesNo) = vbYes Then
lPHand = Val(ListView1.SelectedItem.SubItems(1))
lPHand = OpenProcess(1&, True, lPHand) '获取进程句柄
TMBack = TerminateProcess(lPHand, 0&) '关闭进程
If TMBack <> 0 Then
MsgBox "进程[" & ListView1.SelectedItem.Text & "]已经被终止!"
Else
MsgBox "进程[" & ListView1.SelectedItem.Text & "]不能被终止!"
End If
CloseHandle lPHand
Command1_Click '刷新进程列表
End If
End If
End Sub'退出
Private Sub Command3_Click()
Unload Me
End Sub'这个函数用于在WIN2000系统中,本进程提升权限
Sub AdjustTokenPrivileges2000()
Dim hdlProcessHandle As Long
Dim hdlTokenHandle As Long
Dim tmpLuid As LUID
Dim tkp As TOKEN_PRIVILEGES
Dim tkpNewButIgnored As TOKEN_PRIVILEGES
Dim lBufferNeeded As Long
Dim lp As Long
hdlProcessHandle = GetCurrentProcess()
lp = OpenProcessToken(hdlProcessHandle, TOKEN_ALL_ACCESS, hdlTokenHandle)
lp = LookupPrivilegeValue("", "SeDebugPrivilege", tmpLuid)
tkp.PrivilegeCount = 1
tkp.Privileges(0).pLuid = tmpLuid
tkp.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
lp = AdjustTokenPrivileges(hdlTokenHandle, False, tkp, Len(tkpNewButIgnored), tkpNewButIgnored, lBufferNeeded)
End Sub