VB6 エラーメッセージ(DLL)操作 |
API API(DLL)呼び出しの際にエラーが発生した場合、Err.LastDllError にエラーコードが入ります。このエラーコードから、エラーメッセージを抽出する場合に、FormatMessageを使います。 |
|
[標準モジュール] ' Constants - FormatMessage.dwFlags Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER As Long = &H100 Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY As Long = &H2000 Private Const FORMAT_MESSAGE_FROM_HMODULE As Long = &H800 Private Const FORMAT_MESSAGE_FROM_STRING As Long = &H400 Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000 Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = &H200 Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK As Long = &HFF '========================================== ' メッセージの文字列を指定の書式で取得する '========================================== Public Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageA" _ (ByVal dwFlags As Long, lpSource As Any, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, _ ByVal lpBuffer As String, ByVal nSize As Long, Arguments As Any) As Long ' Constants - LoadLibraryEx.dwFlags Private Const DONT_RESOLVE_DLL_REFERENCES As Long = &H1 Private Const LOAD_IGNORE_CODE_AUTHZ_LEVEL As Long = &H10 Private Const LOAD_LIBRARY_AS_DATAFILE As Long = &H2 Private Const LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE As Long = &H40 Private Const LOAD_LIBRARY_AS_IMAGE_RESOURCE As Long = &H20 Private Const LOAD_WITH_ALTERED_SEARCH_PATH As Long = &H8 Public Declare Function LoadLibraryEx Lib "kernel32" Alias "LoadLibraryExA" _ (ByVal lpFileName As String, ByVal hFile As Long, ByVal dwFlags As Long) As Long Public Declare Function FreeLibrary Lib "kernel32" (ByVal hModule As Long) As Long Public Declare Function GetLastError Lib "kernel32.dll" () As Long |
【サンプルリスト】 '================================================== ' エラーコードに対応するエラーメッセージを取得する ' dwMessageId : Err.LastDllErrorのエラーコード '================================================== Public Function ErrMessage_GetLastError(dwMessageId As Long) As String Dim dwFlags As Long 'オプションフラグ Dim lpBuffer As String 'メッセージを格納するたのバッファ Dim result As Long '戻り値(文字列のバイト数) dwFlags = FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS Or FORMAT_MESSAGE_MAX_WIDTH_MASK lpBuffer = String(1024, vbNullChar) result = FormatMessage(dwFlags, 0&, dwMessageId, 0&, lpBuffer, Len(lpBuffer), 0&) If (result > 0) Then lpBuffer = Left(lpBuffer, InStr(lpBuffer, vbNullChar) - 1) Else lpBuffer = "" End If ErrMessage_GetLastError = lpBuffer & "(" & dwMessageId & ")" End Function |
【サンプルリスト】 '================================================================ ' WININET.DLLからエラーコードに対応するエラーメッセージを取得する ' dwMessageId : Err.LastDllErrorのエラーコード '================================================================= Public Function ErrMessage_WinInet(dwMessageId As Long) As String Dim dwFlags As Long 'オプションフラグ Dim lpBuffer As String 'メッセージを格納するたのバッファ Dim hModule As Long 'DLLファイルのハンドル Dim result As Long '戻り値(文字列のバイト数) dwFlags = FORMAT_MESSAGE_IGNORE_INSERTS Or FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_MAX_WIDTH_MASK lpBuffer = String(1024, vbNullChar) hModule = LoadLibraryEx("WININET.DLL", 0&, LOAD_LIBRARY_AS_DATAFILE) If (hModule <> 0) Then dwFlags = dwFlags Or FORMAT_MESSAGE_FROM_HMODULE result = FormatMessage(dwFlags, ByVal hModule, dwMessageId, 0&, lpBuffer, Len(lpBuffer), 0&) If (hModule <> 0) Then FreeLibrary hModule If (result > 0) Then lpBuffer = Left(lpBuffer, InStr(lpBuffer, vbNullChar) - 1) Else lpBuffer = "" End If ErrMessage_WinInet = lpBuffer & "(" & dwMessageId & ")" End Function |
●FormatMessage
|