●やりたいこと
何かしらの不具合で残留しているプロセスを一括で強制終了し、ついでに必要なプログラムを実行するプログラム(以下TaskCNT.exe)を作成しています。
TaskCNT.exeの実行時に時折「TaskCNTは動作を停止しました」エラーが発生してしまいます。
該当エラー発生時刻と思われるタイミングで、[イベントビューア]には下記の記録がありました。
障害が発生しているアプリケーション名: TaskCNT.exe、バージョン: 1.1.1.0、タイム スタンプ: 0x5d3a9089
障害が発生しているモジュール名: KERNELBASE.dll、バージョン: 10.0.14393.3085、タイム スタンプ: 0x5d1d7bde
例外コード: 0xe0434352
障害オフセット: 0x000dc1e2
障害が発生しているプロセス ID: 0x2708
障害が発生しているアプリケーションの開始時刻: 0x01d545a7464f77ec
障害が発生しているアプリケーション パス: C:\Users\800001\Documents\Tool\TaskCNT.exe
障害が発生しているモジュール パス: C:\windows\System32\KERNELBASE.dll
レポート ID: c943f0d1-f5b3-44b1-b5af-7e4d1721eb9f
障害が発生しているパッケージの完全な名前:
障害が発生しているパッケージに関連するアプリケーション ID:
「TaskCNTは動作を停止しました」エラーが出ているとTaskCNT.exeが終了ずに残った状態になってしまうため、エラーが出ないようにするかエラーを無視して動作するようにしたいです。
エラーの発生タイミングや原因が全く分からず、発生も毎回ではなく同じプロセスを実行させてもたまに出たり出なかったりします。
●調べたこと
また、Visual Studio でデバッグ中、TaskCNTからExcelマクロを実行した際、Excelマクロが何かしらの原因でエラーが発生したり強制終了したときにTaskCNT内のxlApp.Run(bookName & "!" & mtd)
の部分で下記のエラーが出ることに気づきました。
型 'System.Runtime.InteropServices.COMException' のハンドルされていない例外が Microsoft.VisualBasic.dll で発生しました
追加情報:リモート プロシージャ コールに失敗しました。 (HRESULT からの例外:0x800706BE)
そこで、マクロやプロセスを実行する部分をまるっとTry
で括るとマクロ強制終了時にエラーは出ずに本プログラムも正常に終了します。
しかし、肝心のKERNELBASE.dllが原因の「TaskCNTは動作を停止しました」エラーが不定期で発生する現象は直らず。
以下、ソースコードです。
VB
1Imports System.Management 2 3Module Module1 4 5 'メイン関数 6 Sub Main() 7 Dim Current_dir As String 8 Dim tgt_process As Object, tgt As String 9 10 'カレントディレクトリ取得 11 Current_dir = My.Application.Info.DirectoryPath 12 Console.WriteLine(Current_dir) 13 14 '終了対象プロセスを取得 15 tgt_process = Load_Settings(Current_dir & "\kill.ini") 16 If IsArray(tgt_process) Then 17 'すべてのプロセス一覧で実施する 18 For Each tgt In tgt_process 19 Dim arg As Object = Split(tgt, "?") 20 21 'tgtのプロセスを取得 22 Dim ps As System.Diagnostics.Process() = 23 System.Diagnostics.Process.GetProcessesByName(arg(0)) 24 25 If UBound(arg) = 0 Then 'ユーザ名指定なくプロセス終了 26 For Each p As System.Diagnostics.Process In ps 27 'プロセスを強制的に終了させる 28 p.Kill() 29 Next 30 ElseIf UBound(arg) = 1 Then 'ユーザ名指定でプロセス終了 31 '対象のユーザー名のみ強制終了 32 pkill_by_user(arg(1), ps) 33 End If 34 Next 35 Else 36 Console.WriteLine("kill.iniの記載が見当たりません。") 37 End If 38 39 '起動対象プロセスを取得 40 tgt_process = Load_Settings(Current_dir & "\launch.ini") 41 If IsArray(tgt_process) Then 42 'すべてのプロセス一覧で実施する 43 For Each tgt In tgt_process 44 Dim arg As Object = Split(tgt, "?") 45 46 '相対パスを絶対パスにする 47 System.Environment.CurrentDirectory = Current_dir 48 arg(0) = System.IO.Path.GetFullPath(arg(0)) 49' Try '★←ここをTryで括るとマクロ強制終了時にエラーは出ないものの、原因不明のKERNELBASE.dllエラーは直らず 50 If UBound(arg) = 2 Then 'Excelマクロ実行 51 Call CallMacro(arg(0), arg(1), arg(2)) 52 ElseIf UBound(arg) = 3 Then 'Excelマクロ実行(セーブフラグ付き) 53 Call CallMacro(arg(0), arg(1), arg(2), arg(3)) 54 ElseIf UBound(arg) = 0 Then 'プロセス起動 55 'tgtのプロセスを起動 56 Dim p As System.Diagnostics.Process = System.Diagnostics.Process.Start(tgt) 57 End If 58' Catch ex As Exception 59' Console.WriteLine("プロセス「" & tgt & "」が見つかりません。") 60' End Try 61 62 Next 63 Else 64 Console.WriteLine("launch.iniの記載が見当たりません。") 65 End If 66 67 '#If DEBUG Then 68 ' Console.WriteLine("続行するには何かキーを押してください...") 69 ' Console.ReadKey() 70 '#End If 71 End Sub 72 73 74 '設定ファイルを読み込む 75 Function Load_Settings(ByVal fileName As String) 76 Dim tmp_line As String, arynum As Long = 0, Ans_vrt = New String() {""} 77 78 Load_Settings = "" '戻り値をリセット 79 80 If System.IO.File.Exists(fileName) Then '設定ファイルが存在する場合のみ読み出す 81 'fileNameをShift-JISコードとして開く 82 Dim sr As New System.IO.StreamReader(fileName, 83 System.Text.Encoding.GetEncoding("shift_jis")) 84 '内容を一行ずつ読み込む 85 While sr.Peek() > -1 86 tmp_line = sr.ReadLine() 87 tmp_line = Trim(tmp_line) 88 '#から始まっていたらエスケープ文字と判断 89 If Left(tmp_line, 1) <> "#" And Len(tmp_line) > 0 Then 90 ReDim Preserve Ans_vrt(arynum) 91 Ans_vrt(arynum) = tmp_line 92 arynum = arynum + 1 93 End If 94 End While 95 96 '内容が何か入っていたら実施 97 If arynum > 0 Then 98 Load_Settings = Ans_vrt '戻り値を出す 99 End If 100 End If 101 102 End Function 103 104 'Excelのマクロを実行する 105 Sub CallMacro(ByVal fileName As String, ByVal bookName As String, ByVal mtd As String, Optional ByVal saveE As Boolean = True) 106 ' Excel.Application の新しいインスタンスを生成する 107 Dim xlApp As New Object 108 Dim xlBooks As Object 109 110 xlApp = CreateObject("Excel.Application") 111 xlBooks = xlApp.Workbooks 112 113 ' xlApplication から WorkBooks を取得する 114 ' 既存の Excel ブックを開く 115 xlBooks = xlApp.Workbooks 116 xlBooks.Open(fileName) 117 118 ' Excel 表示有無 119 xlApp.Visible = False 120 '保存しますかダイアログ非表示 121 xlApp.DisplayAlerts = False 122 123 ' マクロを実行する 124 xlApp.Run(bookName & "!" & mtd) '★←マクロが強制終了するとここでエラー 125 126 'セーブフラグがあれば保存する 127 If saveE Then 128 xlBooks(1).Save() 129 End If 130 131 ' Excel を終了する 132 xlApp.Quit() 133 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBooks) 134 System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) 135 End Sub 136 137 '特定ユーザーのプロセスを終了する 138 Sub pkill_by_user(ByVal tgt_user As String, ByVal ps As System.Diagnostics.Process()) 139 Dim id_tgt_user = New String() {""}, ui As Long = 0 140 Dim mc As New System.Management.ManagementClass("Win32_Process") 141 Dim moc As System.Management.ManagementObjectCollection = mc.GetInstances() 142 Dim mo As System.Management.ManagementObject 143 For Each mo In moc 144 Dim id As String = mo("ProcessId").ToString() 145 146 Dim methodName(1) As String 147 mo.InvokeMethod("GetOwner", methodName) 148 Dim user As String = methodName(0) 149 Dim domain As String = methodName(1) 150 151 If tgt_user = user Then 152 ReDim Preserve id_tgt_user(ui) 153 id_tgt_user(ui) = id 154 ui = ui + 1 155 End If 156 Next mo 157 158 If ui > 0 Then 159 For Each p As System.Diagnostics.Process In ps 160 For Each u As String In id_tgt_user 161 'プロセスID一致検索 162 If p.Id = u Then 163 'プロセスを強制的に終了させる 164 p.Kill() 165 End If 166 Next 167 Next 168 End If 169 End Sub 170 171End Module

回答1件
あなたの回答
tips
プレビュー