Openprocess总是返回0解决方法

Openprocess总是返回0
如题, 部分代码如下:


Public Const TH32CS_SNAPHEAPLIST = &H1
Public Const TH32CS_SNAPPROCESS = &H2
Public Const TH32CS_SNAPTHREAD = &H4
Public Const TH32CS_SNAPMODULE = &H8
Public Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
Public Const TH32CS_INHERIT = &H80000000
Public Const MAX_PATH As Integer = 260
Public Type PROCESSENTRY32 
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntTreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * MAX_PATH  
End Type

Public Const PROCESS_TERMINATE = &H1
Public Const PROCESS_ALL_ACCESS = &H1F0FFF

Public Declare Function OpenProcess Lib "kernel32 " Alias "OpenProcess " (ByVal dwDesiredAccess As Integer, ByVal blnheritHandle As Integer, ByVal dwAppProcessId As Integer) As Integer
Public Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public Declare Function TerminateProcess Lib "kernel32 " (ByVal hProcess As Long, ByVal uExitCode As Long) As Long

Dim proc As PROCESSENTRY32
Dim snap As Long
Dim exename As String
Dim theLoop As Long
Dim hand%
snap = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0)
proc.dwSize = Len(proc)
theLoop = Process32First(snap, proc)
While theLoop <> 0 
exename = proc.szExeFile
If Left(exename, 12) = "iexplore.exe" Then
  hand = OpenProcess(PROCESS_TERMINATE, True, proc.th32ProcessID)
  Debug.Print hand
  TerminateProcess hand, 0
End If
CloseHandle snap

取得的hand值总是0,请高手指点啊


------解决方案--------------------
http://topic.****.net/t/20050801/14/4181298.html
------解决方案--------------------
VB code
Option Explicit'强制变量声明

'定义进程结构
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 * 260
End Type

Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
'在进程队列中获取首个进程的地址
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long
'进程队列指针下移
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, lppe As PROCESSENTRY32) As Long
'打开进程
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long
'关闭进程
Private Declare Function TerminateProcess Lib "kernel32" (ByVal ApphProcess As Long, ByVal uExitCode As Long) As Long
'释放句柄
Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)
Private Const TH32CS_SNAPPROCESS = &H2&

Private Sub KillProcess(sProcess As String)
Dim lSnapShot As Long
Dim lNextProcess As Long
Dim tPE As PROCESSENTRY32
'创建进程队列快照
lSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0&)
'如果队列不为空则搜索
If lSnapShot <> -1 Then
'获取进程控制块
tPE.dwSize = Len(tPE)
'取首个进程的地址
lNextProcess = Process32First(lSnapShot, tPE)
'循环搜索
Do While lNextProcess
'判断是否索索到进程
If LCase$(sProcess) = LCase$(Left(tPE.szExeFile, InStr(1, tPE.szExeFile, Chr(0)) - 1)) Then
'结束进程
Dim lProcess As Long
Dim lExitCode As Long
lProcess = OpenProcess(1, False, tPE.th32ProcessID)
TerminateProcess lProcess, lExitCode
CloseHandle lProcess
End If
'进程指针下移一位,搜索下一个进程
lNextProcess = Process32Next(lSnapShot, tPE)
Loop
'释放进程句柄
CloseHandle (lSnapShot)
End If
End Sub