NET HELPMSG で表示されるエラーメッセージ一覧

以前にWindows XP MLに投稿した、NET HELPMSG で表示されるメッセージの一覧を取得するためのプログラム。再利用できそうなので、掲載してみる。

下記例では、C:\err.txtにエラーメッセージの一覧を保存する。0以上のエラー番号すべてについてループしているため、実行に時間がかかる。そのため、夜間などに実行しておくのがよいだろう。

ちなみに、Web 上では
http://msdn.microsoft.com/library/en-us/debug/base/system_error_codes.asp
にエラー番号とそれに対応するメッセージの一覧がある。


テキストファイルに落としたいなら、下記のプログラムをどうぞ。素のVBがなければ、Excel などの VBA 環境で動かしてください。もしかすると WMI でもう少しスマートに書けるのかも知れません。

注意点としては、OS によって用意されているメッセージが異なる点と、NET HELPMSG と FormatMessage では番号の対応が必ずしも一致していないことです。

例えば、NET HELPMSG 3871 では NET HELPMSG のヘルプが表示されますが、下記の FormatMessage では 3871 に対応するメッセージは表示されません。

Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000
Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY As Long = &H2000
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" ( _
    ByVal dwFlags As Long, _
    ByVal lpSource As Long, _
    ByVal dwMessageId As Long, _
    ByVal dwLanguageId As Long, _
    ByVal lpBuffer As String, _
    ByVal nSize As Long, _
    ByVal Arguments As Long _
) As Long
        
Private Function ErrorMessage(ByVal dwErrorCode As Long) As String
    Dim dwLen   As Long
    Dim buf     As String
    
    buf = String$(512, vbNullChar)
    dwLen = FormatMessage( _
        FORMAT_MESSAGE_ARGUMENT_ARRAY Or FORMAT_MESSAGE_FROM_SYSTEM, _
        0, _
        dwErrorCode, _
        0, _
        buf, _
        Len(buf) - 1, _
        0)
    If dwLen <> 0 Then
        ErrorMessage = Left$(buf, InStr(buf, vbNullChar) - 1)
    Else
        ErrorMessage = vbNullString
    End If
End Function

       
Public Sub MakeErrorList()
    Dim iFile   As Integer
    Dim e       As Long
    Dim s       As String
    
    iFile = FreeFile
    Open "C:\err.txt" For Output As iFile
    For e = 0 To &H7FFFFFFF
        s = ErrorMessage(e)
        If Len(s) <> 0 Then Print #iFile, e & ":" & s
    Next
    Close iFile
End Sub