我正在尝试监控用户选择的流程。我正在做的是尝试从进程名称获取文件名,因此当找不到进程时它可以再次启动它。现在我不明白我的问题。我在这里收到错误:Dim s As String = ProcessArray(0).MainModule.FileName
。
我不明白的是它正在返回文件名。任何人都可以帮我解决这个问题吗?
Dim ProcessArray As Process()
ProcessArray = Process.GetProcessesByName(procName)
Dim s As String = ProcessArray(0).MainModule.FileName
Dim f As Process
Dim p As Process() = Process.GetProcessesByName(procName)
For Each f In p
If p.Length > 0 Then
For i As Integer = 0 To p.Length - 1
ProcessID = (p(i).Id)
Next
Else
ProcessID = 0
End If
If ProcessID = 0 Then
BotRunning = False
Process.Start(s)
watchdogbool = True
RunBot(watchdogList, ItemClicked.Text, -1)
End If
Next
答案 0 :(得分:1)
如果找不到该进程,则找到的进程数组将为空。因此,您无法访问其第一个元素。在s
的声明中,你假设你总是至少有一个结果。
答案 1 :(得分:1)
正如其他人已经说过的那样,当没有找到给定名称的进程时,就会发生错误。因此,s
在发生错误时具有有效值的唯一方法是,如果在循环内执行代码并且s
具有上一次迭代的值(进程仍在运行中),则实际的错误发生了。
最重要的是,您希望实现的代码和描述不匹配。基本上如果你想在你的程序找不到它时再次启动它,那么我会期待某种循环。
我猜你想要这样的东西:
Public Sub WatchProcess(procName As String)
Dim processArray As Process() = Process.GetProcessesByName(procName)
' The process must be running when your program starts. If not, throw an exception
If processArray.Length = 0 Then Throw New ArgumentException("no such process", "procName")
Dim fileName As String = processArray(0).MainModule.FileName
While True ' Looking for the process endlessly. Use other conditions proper for you.
If Process.GetProcessesByName(procName).Length = 0 Then
' The process is not running anymore, start it again!
' Do all the other stuff you wanna do (set bool flags etc.)
Process.Start(fileName)
End If
Thread.Sleep(5000) ' Wait 5 seconds until the next check
End While
End Sub
重要的是,这将永远阻止调用线程。因此,您需要使用多线程,让一个线程调用一个procName的方法(如果您想在UI中提供反馈或观察多个进程)。
正如您在评论中所说,您可以获得Win32Exception
声明您无法使用32位进程访问64位进程。要解决此问题,请以与观察过程相同的模式启动您自己的程序(在项目设置=> Compile =>高级编译选项=>目标CPU 下强制目标CPU)。有关详细信息,请参阅相应的其他问题like this one。
答案 2 :(得分:0)
在获得filename
检查之前ProcessArray
不为空,然后继续返回
答案 3 :(得分:0)
此行不返回任何元素
ProcessArray = Process.GetProcessesByName(procName)
这就是为什么当你访问数组的第一个元素(哪个是空的)然后它会给你错误
索引超出数组范围 的解决方案强> 检查对象
null
if(ProcessArray !=null)
Dim s As String = ProcessArray(0).MainModule.FileName
MessageBox.Show("File name is " & ProcessArray(0).MainModule.FileName)
OR
if(ProcessArray.Length>0)
Dim s As String = ProcessArray(0).MainModule.FileName