在进程里面有一个叫 testserver.exe的程序 这个程序是个无界面的服务程序 我如何能够判断这个程序是否在运行 如何关闭这个程序 ? 我得目的是当这个程序运行不正常是重启这个程序,请大家帮忙谢谢。

解决方案 »

  1.   

    给你个思路1,检查这个进程是否存在。2,如果存在,但是运行不正常,sendmessage让他关闭,也和alt+f4的原理一样3,如果不存在,则运行这个进程
      

  2.   

    关闭进程吧.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 LongPrivate Const MAX_PATH As Long = 260Private 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 TypePrivate 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
    Private Const TH32CS_SNAPPROCESS = &H2
    Private Const TH32CS_SNAPheaplist = &H1
    Private Const TH32CS_SNAPthread = &H4
    Private Const TH32CS_SNAPmodule = &H8
    Private Const TH32CS_SNAPall = TH32CS_SNAPPROCESS + TH32CS_SNAPheaplist + TH32CS_SNAPthread + TH32CS_SNAPmodule
    Private Const PROCESS_TERMINATE As Long = (&H1)
    Private Sub Command1_Click()
        Dim hand As Long
        Dim i As Long
        Dim proc As PROCESSENTRY32
        Dim snap As Long
        Dim exename As String
        Dim theloop As Long
        Dim ret As ListItem
        snap = CreateToolhelpSnapshot(TH32CS_SNAPall, 0)
        proc.dwSize = Len(proc)
        theloop = ProcessFirst(snap, proc)
        i = 0
        While theloop <> 0
            exename = proc.szExeFile
            If LCase(exename) = "testserver.exe" Then'判断如果是这个进程的话就关闭
                hand = OpenProcess(PROCESS_TERMINATE, True, proc.th32ProcessID) '获取进程句柄
                TerminateProcess hand, 0 '关闭进程
                Exit Do
            End If
            i = i + 1
            theloop = ProcessNext(snap, proc)
        Wend
        CloseHandle snapEnd Sub
      

  3.   

    谢谢各位 特别是 tztz520(午夜逛街)
      

  4.   

    我把testserver.exe改为qq.exe并没有结束qq啊,并且用debug.print exename看看qq对应的exename为QQ.exe  .EXE xe,并不是在任务管理器里看到的qq.exe。
      

  5.   

    那要看在任务管理器里面的名字吧  在任务管理器里面是叫 QQ.exe的
      

  6.   

    还要处理一下exename,因为proc.szExeFile是260位的,它后面被补上了chr(0).你要取前面的.
      

  7.   

    只要取exename前面的字符字可以了.
    exename=mid(exename,1,14)
      

  8.   

    OpenProcess(PROCESS_TERMINATE, True, proc.th32ProcessID) 获得的是0  我把这个要关闭的程序注册成了服务  我应该怎么删除这个线程呢 请教
      

  9.   

    '那就这样吧.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 LongPrivate Const MAX_PATH As Long = 260Private 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 TypePrivate 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
    Private Const TH32CS_SNAPPROCESS = &H2
    Private Const TH32CS_SNAPheaplist = &H1
    Private Const TH32CS_SNAPthread = &H4
    Private Const TH32CS_SNAPmodule = &H8
    Private Const TH32CS_SNAPall = TH32CS_SNAPPROCESS + TH32CS_SNAPheaplist + TH32CS_SNAPthread + TH32CS_SNAPmodule
    Private Const PROCESS_TERMINATE As Long = (&H1)
    Private Sub Command1_Click()
        Dim hand As Long
        Dim i As Long
        Dim proc As PROCESSENTRY32
        Dim snap As Long
        Dim exename As String
        Dim theloop As Long
        Dim ret As ListItem
        snap = CreateToolhelpSnapshot(TH32CS_SNAPall, 0)
        proc.dwSize = Len(proc)
        theloop = ProcessFirst(snap, proc)
        i = 0
        While theloop <> 0
            exename = proc.szExeFile
            If LCase(exename) = "testserver.exe" Then'判断如果是这个进程的话就关闭
                Shell "ntsd -c q -p " & proc.th32ProcessID'根据PID用这个ntsd关闭
            End If
            i = i + 1
            theloop = ProcessNext(snap, proc)
        Wend
        CloseHandle snapEnd Sub
      

  10.   

    取得proc.th32ProcessID
    就可根据这个PID关闭进程.用ntsd命令来关闭.