0

ユーザーが選択したプロセスを監視しようとしています。私がやっていることは、プロセス名からファイル名を取得しようとしているため、プロセスが見つからない場合は再度起動できます。今、私は自分の問題を理解していません。ここでエラーが発生します: 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
4

4 に答える 4

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

重要なのは、これにより呼び出しスレッドが永久にブロックされることです。そのため、1 つのスレッドで 1 つの procName のメソッドを呼び出すマルチスレッドを使用する必要があります (UI でフィードバックを提供したり、複数のプロセスを監視したりする場合)。

コメントでWin32Exception述べたように、32 ビット プロセスでは 64 ビット プロセスにアクセスできないという記述が得られます。これを解決するには、監視対象のプロセスと同じモードで独自のプログラムを起動します ( [プロジェクト設定] => [コンパイル] => [高度なコンパイル オプション] => [ターゲット CPU ] でターゲット CPU を強制します)。詳細については、このような対応する他の質問を参照してください。

于 2013-01-02T12:44:01.843 に答える
1

プロセスが見つからない場合、見つかったプロセスの配列は空になります。そのため、最初の要素にアクセスできません。の宣言では、s常に少なくとも 1 つの結果が得られると想定しています。

于 2013-01-02T10:33:37.457 に答える
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
于 2013-01-02T10:39:03.610 に答える
0

filenameチェックを取得する前にProcessArray is not null の場合は続行し、それ以外の場合は戻ります

于 2013-01-02T10:38:45.200 に答える