我的 win2000 server经常出现某个 rundll32.exe 进程占用 cpu 100%(任务管理器显示有若干个rundll32.exe 进程,但是占用资源甚少)结束该进程 系统就运行正常请问如何用 vb 结束该 占用 cpu 100% 的 rundll32.exe 进程或者其他 占用 cpu 过大的进程?

解决方案 »

  1.   

    以下不知道对楼主有没有帮助:1、首先使用Process32First和Process32Next等来枚举系统中所有进程;
       你可以将这些进程的exe名称和进程号保存在二维数组中;2、找到你需要结束的进程的进程句柄;
       通过你给的exe名称在二维数组中找到其对应的进程号;3、使用TerminateProcess来结束你指定进程号的进程;
       注意,该api函数不能在nt下直接使用,因为这涉及到nt的权限问题,
       你可以使用LookupPrivilegeValue
      

  2.   

    参考一下, 一个枚举的例程,实现 Gelim(Gelim)所说的第一步:
    http://www.applevb.com/sourcecode/moudle.zip
      

  3.   

    use   TerminateProcess()   api
      

  4.   

    使用 Gelim(Gelim) 的方法应该可以!不过,最最有效的方法应该是按下计算机的 PowerOFF键![百试不爽,没有BUG!]:)
      

  5.   

    ' 添加三个CommandButton和一个ListBoxOption Explicit
    Dim ProcessID() As Long                                          ' 按list1中的进程顺序存储所有进程ID'---------- API类型声明   -----------
    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 * 1024
    End TypePrivate 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 Type THREADENTRY32                  '线程
        dwsize As Long
        cntusage As Long
        th32threadID As Long
        th32OwnerProcessID As Long
        tpBasePri As Long
        tpDeltaPri As Long
        dwFlags As Long
    End Type
    '----------------------------------------- API声明 -------------------------------------------------------
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Private Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
    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 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 Thread32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As THREADENTRY32) As Long
    Private Declare Function Thread32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As THREADENTRY32) 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 GetCurrentProcessId Lib "kernel32" () As Long'---------------------------------------- API常数声明 ------------------------------------------------------
    Private Const TH32CS_SNAPHEAPLIST = &H1
    Private Const TH32CS_SNAPPROCESS = &H2
    Private Const TH32CS_SNAPTHREAD = &H4
    Private Const TH32CS_SNAPMODULE = &H8
    Private Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
    Private Const TH32CS_INHERIT = &H80000000
    Private Const PROCESS_TERMINATE = &H1&Private Sub Command1_Click()
    Dim Process As PROCESSENTRY32
    Dim ProcSnap As Long
    Dim cntProcess As Long
    cntProcess = 0
    List1.Clear
    ProcSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0)
    If ProcSnap Then
        Process.dwsize = 1060                                        ' 通常用法
        Process32First ProcSnap, Process
        Do Until Process32Next(ProcSnap, Process) < 1                ' 遍历所有进程直到返回值为False
            List1.AddItem Trim(Process.szExeFile)
            cntProcess = cntProcess + 1
        Loop
    End If
    ReDim ProcessID(cntProcess) As Long
    Dim i As Long
    i = 0
    Process32First ProcSnap, Process
    Do Until Process32Next(ProcSnap, Process) < 1                    ' 遍历所有进程直到返回值为False
        ProcessID(i) = Process.th32ProcessID
        i = i + 1
    Loop
    CloseHandle (ProcSnap)
    End SubPrivate Sub Command2_Click()
    Dim c As Integer
    If List1.ListIndex < 0 Then
        MsgBox "请选择进程!", vbOKOnly + vbInformation, "提示"
    Else
        Dim hProcess As Long
        hProcess = OpenProcess(PROCESS_TERMINATE, False, ProcessID(List1.ListIndex))
        If hProcess Then TerminateProcess hProcess, 0
        c = List1.ListCount
        While List1.ListCount = c
            Command1_Click
        Wend
    End If
    End SubPrivate Sub Command3_Click()
    Unload Me
    End Sub
      

  6.   

    Const TH32CS_SNAPHEAPLIST = &H1
    Const TH32CS_SNAPPROCESS = &H2
    Const TH32CS_SNAPTHREAD = &H4
    Const TH32CS_SNAPMODULE = &H8
    Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST Or TH32CS_SNAPPROCESS Or TH32CS_SNAPTHREAD Or TH32CS_SNAPMODULE)
    Const TH32CS_INHERIT = &H80000000
    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
    Private Declare Function CreateToolhelp32Snapshot Lib "Kernel32" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
    Private Declare Function Process32First Lib "Kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
    Private Declare Function Process32Next Lib "Kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
    Private Declare Sub CloseHandle Lib "Kernel32" (ByVal hPass As Long)
    Private Sub Form_Load()
        Dim hSnapShot As Long, uProcess As PROCESSENTRY32
        'Takes a snapshot of the processes and the heaps, modules, and threads used by the processes
        hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, 0&)
        'set the length of our ProcessEntry-type
        uProcess.dwSize = Len(uProcess)
        'Retrieve information about the first process encountered in our system snapshot
        r = Process32First(hSnapShot, uProcess)
        'set graphics mode to persistent
        Me.AutoRedraw = True
        Do While r
            Me.Print Left$(uProcess.szExeFile, IIf(InStr(1, uProcess.szExeFile, Chr$(0)) > 0, InStr(1, uProcess.szExeFile, Chr$(0)) - 1, 0))
            'Retrieve information about the next process recorded in our system snapshot
            r = Process32Next(hSnapShot, uProcess)
        Loop
        'close our snapshot handle
        CloseHandle hSnapShot
    End Sub
      

  7.   

    用TerminateProcess 结束进程Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long