正在寻找使用excel vba检查可执行文件是否仍在运行的最快方法
我有一个检查可执行文件是否仍在运行的代码,但问题是,在检查可执行文件是否正在运行时,我发现它非常慢。有没有最快的方法正在寻找使用excel vba检查可执行文件是否仍在运行的最快方法,excel,vba,Excel,Vba,我有一个检查可执行文件是否仍在运行的代码,但问题是,在检查可执行文件是否正在运行时,我发现它非常慢。有没有最快的方法 Public Function IsExeRunning(sExeName As String, Optional sComputer As String = ".") As Boolean On Error GoTo Error_Handler Dim objProcesses As Object Set objProcesses = GetO
Public Function IsExeRunning(sExeName As String, Optional sComputer As
String = ".") As Boolean
On Error GoTo Error_Handler
Dim objProcesses As Object
Set objProcesses = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sComputer & "\root\cimv2").ExecQuery("SELECT * FROM Win32_Process WHERE Name like '" & sExeName & "'") ' = '" & sExeName & "'")
If objProcesses.Count <> 0 Then IsExeRunning = True
Error_Handler_Exit:
On Error Resume Next
Set objProcesses = Nothing
Exit Function
Error_Handler:
MsgBox "The following error has occured." & vbCrLf & vbCrLf & _
"Error Number: IsExeRunning" & vbCrLf & _
"Error Description: " & Err.Description, _
vbCritical, "An Error has Occured!"
Resume Error_Handler_Exit
End Function
公共函数正在运行(sExeName作为字符串,可选的sComputer作为字符串)
字符串=“.”)作为布尔值
关于错误转到错误处理程序
作为对象的Dim OBJ进程
设置objprocess=GetObject(“winmgmts:{impersonationLevel=impersonate}!\\”&scocomputer&“\root\cimv2”).ExecQuery(“从Win32\u进程中选择*,其中名称类似“&&sExeName&“””””=“&sExeName&“”)
如果objprocess.Count为0,则IsExeRunning=True
错误\u处理程序\u退出:
出错时继续下一步
设置objprocess=Nothing
退出功能
错误\u处理程序:
MsgBox“发生以下错误。”&vbCrLf&vbCrLf&_
“错误号:IsExeRunning”&vbCrLf&_
“错误说明:”&错误说明_
vbCritical,“发生错误!"
恢复错误\u处理程序\u退出
端函数
由于like查询的实现不太正确,这可能与您期望的不完全一样。我已经解决了这一问题,并添加了一些优化,主要是减少返回查询项的数量,添加了精确匹配方法,并添加了缓存方法,以在查询之前存储对计算机的引用
Option Explicit
'Function averages 0.03 seconds on my machine
Public Function IsExeRunning(sExeName As String, _
Optional sComputer As String = ".", _
Optional ExactMatch As Boolean = False) As Boolean
On Error GoTo Error_Handler
Static Computer As Object
Dim Process As Object
Dim SearchQuery As String
IsExeRunning = False
'Cache Computer reference
If Computer Is Nothing Or sComputer <> "." Then Set Computer = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & sComputer & "\root\cimv2")
'Build query
If ExactMatch Then
SearchQuery = "SELECT Name FROM Win32_Process WHERE Name = '" & sExeName & "'"
Else
SearchQuery = "SELECT Name FROM Win32_Process WHERE Name like '%" & sExeName & "%'"
End If
Set Process = Computer.ExecQuery(SearchQuery)
If Process Is Nothing Then Exit Function
If Process.Count = 0 Then Exit Function
IsExeRunning = True
Error_Handler_Exit:
Exit Function
Error_Handler:
Resume Error_Handler_Exit
End Function
Sub TestRunner()
Dim t As Single
t = Timer
Debug.Print "Function returns " & IsExeRunning("Excel", ".", False) & " took: " & Timer - t & " seconds"
End Sub
选项显式
'在我的机器上,功能平均为0.03秒
公共函数IsExeRunning(sExeName作为字符串_
可选的sComputer As String=“.”_
可选ExactMatch As Boolean=False)作为Boolean
关于错误转到错误处理程序
以静态计算机为对象
作为对象的模糊过程
Dim SearchQuery作为字符串
IsExeRunning=错误
'缓存计算机参考
如果计算机为Nothing或sComputer“”,则设置Computer=GetObject(“winmgmts:{impersonationLevel=impersonate}!\\”&sComputer&“\root\cimv2”)
'生成查询
如果你能匹配的话
SearchQuery=“从Win32中选择名称”\u进程,其中名称=”&sExeName&“
其他的
SearchQuery=“从Win32\u进程中选择名称,其中名称类似“%”和sExeName&“%”
如果结束
设置进程=Computer.ExecQuery(SearchQuery)
若进程为空,则退出函数
如果Process.Count=0,则退出函数
IsExeRunning=True
错误\u处理程序\u退出:
退出功能
错误\u处理程序:
恢复错误\u处理程序\u退出
端函数
子TestRunner()
把t调暗为单身
t=计时器
Debug.Print“Function returns”&IsExeRunning(“Excel”,“False”)和“take:”&Timer-t&“seconds”
端接头
<>代码>如果代码在运行,但你觉得可以有改进,然后考虑把它放上去。这是本文的主题。嗨,赖安,非常感谢你的回答。我已经通过创建一个DLL文件来解决这个问题,这将是对Excel VBA的参考。