在我的程序中需要调用C:\a.exe,用shell实现的,但是在shell此之前想先判断a.exe是否已经在运行。请问该如何判断呢?

解决方案 »

  1.   

    Private Sub Command1_Click()
       MsgBox IIf(Isrunexe("a.exe"), "运行中", "没运行")
    End SubPublic Function Isrunexe(ExeNm As String) As Boolean
       Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
       Set colProcesslist = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & ExeNm & "'")
       Isrunexe = IIf(colProcesslist.Count > 0, True, False)
       Set objWMIService = Nothing
       Set colProcesslist = Nothing
    End Function
      

  2.   

    可以用 FileSystemObject的fileexists()
    也可以用 Dir$。
      

  3.   

    Option ExplicitPrivate Sub Command1_Click()
       MsgBox IIf(Isrunexe("a.exe"), "运行中", "没运行")
    End SubPublic Function Isrunexe(ExeNm As String) As Boolean
       Dim objWMIService As Object
       Dim colProcesslist As Object
       Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
       Set colProcesslist = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & ExeNm & "'")
       Isrunexe = IIf(colProcesslist.Count > 0, True, False)
       Set objWMIService = Nothing
       Set colProcesslist = Nothing
    End Function
    经过测试上面的代码也可以,不知道楼主您是同意那种声明方法
      

  4.   

    '呵呵, 谢谢楼上提醒, 
    "经过测试上面的代码也可以,不知道楼主您是同意那种声明方法"不用同不同意, 这是因我复制粘贴手上现成代码时, 忘了贴上通用区的宣告, 而这是 "必需" 加的.Option Explicit
    Dim objWMIService, colProcesslist
    Private Sub Command1_Click()
       MsgBox IIf(Isrunexe("a.exe"), "运行中", "没运行")
    End SubPublic Function Isrunexe(ExeNm As String) As Boolean
       Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
       Set colProcesslist = objWMIService.ExecQuery("Select * from Win32_Process Where Name = '" & ExeNm & "'")
       Isrunexe = IIf(colProcesslist.Count > 0, True, False)
       Set objWMIService = Nothing
       Set colProcesslist = Nothing
    End Function
      

  5.   

    谢谢各位兄弟的回复,特别感谢cmb666提供的方法,简单好用。另外我还查到另一种用API的判断方法,也贴出来和兄弟们一块看看。
    Private Const TH32CS_SNAPPROCESS = &H2
    Private Const MAX_PATH As Integer = 260Public 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 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 LongPublic Function GetTargetProcessID(ByVal lpProcess As String) As Long    Dim dwRet As Long
        Dim hSnapShot As Long
        Dim pe32 As PROCESSENTRY32
        
        hSnapShot = CreateToolhelpSnapshot(TH32CS_SNAPPROCESS, 0)
        
        pe32.dwSize = LenB(pe32)
        
        ProcessFirst hSnapShot, pe32
        
        Do
            If InStr(pe32.szExeFile, lpProcess) > 0 Then
                dwRet = pe32.th32ProcessID
                Exit Do
            Else
                pe32.szExeFile = String(MAX_PATH, 0)
            End If
        Loop While (ProcessNext(hSnapShot, pe32))
        
        CloseHandle (hSnapShot)
        
        GetTargetProcessID = dwRet
        
    End Function如果程序已经运行GetTargetProcessID返回程序的PID,否则返回0