-1

プロセスがWordをハングさせるかどうかを確認するために、VB.Net 2003プロジェクトを介して、プロセス制御を行うスレッドを作成します(問題)。プロセスがまだアクティブである一定のミリ秒後、スレッドからプロセスを強制終了します。システムは「System.ComponentModel.Win32Exception」、「アクセスが拒否されました」と通知します

コードは次のとおりです。

これはコードVbです:

Imports  System
Imports  System.Threading
Imports  System.Threading.Thread
Imports  System.Security.Permissions
Public Class  ThreadMain
Public  strdotName AsString
Public  strdocName AsString
Public  sXML AsString
Public  idProcesso AsInteger
Public  terminate AsInteger
Public docName AsString
Public  kk AsInteger
Public  finito AsBoolean= False
Public Function LaunchThread() AsInteger
Dim myT2 As Threading.Thread
myT2 = New Threading.Thread(AddressOfMe.DoWork)
myT2.IsBackground = True
myT2.Start()
Try
Console.WriteLine("Finito: {0}", finito)
Catch  Ex As  Exception
End Try
Return terminate
End Function
*-------**
Private Sub DoWork()
Dim  j AsInteger
Dim  errore AsString
Dim  trovato AsBoolean
Dim  colProcess AsProcess
Dim  nomeProcess AsProcess()
Dim  chiusura AsBoolean
Try
For  j = 100 To  20000
colProcess = Process.GetProcessById(idProcesso)
If  Not  colProcess IsNothingThen
j = j + 1000
System.Threading.Thread.Sleep(1)
trovato = True
Else
trovato = False
End If
Next
If  trovato Then
chiusura = colProcess.CloseMainWindow()
colProcess.Close()
Process.GetProcessById(idProcesso).Kill()
terminate = 1
End If
Catch ex As Exception
errore = ex.ToString
terminate = 2
End Try
End Sub 'DoWork
4

1 に答える 1

1

「idProcesso」変数は、コードのどこにも割り当てられていません。これはおそらく、その値がまだゼロであることを意味します。これは、「システム」プロセスを強制終了しようとしていることを意味します。これは、Windows のカーネル コンポーネントをカプセル化する偽のプロセスです。そのように Windows を強制終了することは不可能です。ユーザーの権限に関係なく、常に AccessDenied 例外が発生します。

特定のプロセスをターゲットにするには、Process.GetProcessesByName() を使用する必要があります。

これが、Microsoft.Office.Interop.Word 名前空間を使用するときに Word を終了させるための回避策である場合、これは未処理の例外で独自のプログラムを終了させる良い方法にすぎません。または、さらに言えば、ユーザーが使用している Word の別のインスタンスです。彼女は自分の仕事を失うことにあまり感謝しません。

于 2012-08-29T13:19:50.777 に答える