Imports System
Imports System.IO
Imports System.Text
Imports System.Runtime.InteropServices
' 簡単なログ・クラス
Public Class MyLogger
Dim log As New StringBuilder()
' ログの追加
Public Sub Add(ByVal line As String)
log.AppendLine(line)
End Sub
' ログの保存(ログ・ファイルの名前は「yyyymmdd.txtの」形式)
Public Sub Save()
Dim file As String = DateTime.Now.ToString("yyyyMMdd") + ".txt"
Dim enc As Encoding = Encoding.GetEncoding("Shift_JIS")
' 追加書き込み(文字コードはShift-JISを使用)
Using sw As New StreamWriter(file, True, enc)
sw.Write(log.ToString())
End Using
End Sub
End Class
' Win32 APIであるSetConsoleCtrlHandler関数の宣言
<DllImport("Kernel32")> _
Shared Function SetConsoleCtrlHandler( _
ByVal Handler As HandlerRoutine, _
ByVal Add As Boolean) As Boolean
End Function
' SetConsoleCtrlHandler関数にメソッド(ハンドラ・ルーチン)を
'渡すためのデリゲート型
Delegate Function _
HandlerRoutine(ByVal CtrlType As CtrlTypes) As Boolean
Dim logger As New MyLogger()
Dim myHandlerDele As HandlerRoutine
Sub New()
' myHandlerメソッドの登録
myHandlerDele = New HandlerRoutine(AddressOf myHandler)
SetConsoleCtrlHandler(myHandlerDele, True)
End Sub
Sub Run()
While True
Dim line As String = DateTime.Now + " 出力"
Console.WriteLine(line)
logger.Add(line) ' ログの追加
System.Threading.Thread.Sleep(2000) ' 2秒間待つ
End While
End Sub
' ハンドラ・ルーチン
Function myHandler(ByVal ctrlType As CtrlTypes) As Boolean
logger.Add("強制終了:" & ctrlType.ToString()) ' ログの追加
logger.Save() ' ログの保存
Return False
End Function
Shared Sub Main()
Dim p As New MyProgram()
p.Run()
End Sub
End Class