Private Const FORMAT_MESSAGE_ALLOCATE_BUFFER As Long = 256
Private Const FORMAT_MESSAGE_IGNORE_INSERTS As Long = 512
Private Const FORMAT_MESSAGE_FROM_STRING As Long = 1024
Private Const FORMAT_MESSAGE_FROM_HMODULE As Long = 2048
Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = 4096
Private Const FORMAT_MESSAGE_ARGUMENT_ARRAY As Long = 8192
Private Const FORMAT_MESSAGE_MAX_WIDTH_MASK As Long = 255
Private Const LANG_NEUTRAL As Long = &H0
Private Const SUBLANG_DEFAULT As Long = &H1
Private Declare Function lstrcpy Lib "kernel32" Alias "lstrcpyW" (ByRef lpString1 As Byte, ByVal lpString2 As Long) As Long
Private Declare Function FormatMessage Lib "kernel32" Alias "FormatMessageW" (ByVal dwFlags As Long, ByVal lpSource As Long, ByVal dwMessageId As Long, ByVal dwLanguageId As Long, ByVal lpBuffer As Long, ByVal nSize As Long, ByVal Arguments As Long) As Long
Private Declare Function LocalFree Lib "kernel32" (ByVal hMem As Any) As Long
Private Function MAKELANGID(ByVal p As Long, ByVal s As Long) As Long
MAKELANGID = (CLng(CInt(s)) * 1024) Or CLng(CInt(p))
End Function
Private Function GetErrorText(ByVal dwErrorCode As Long) As String
Dim dwMessageLength As Long, lpBuffer As Long
Dim bBuffer() As Byte
dwMessageLength = FormatMessage( _
FORMAT_MESSAGE_ALLOCATE_BUFFER Or FORMAT_MESSAGE_FROM_SYSTEM Or FORMAT_MESSAGE_IGNORE_INSERTS, _
0, _
dwErrorCode, _
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), _
VarPtr(lpBuffer), _
0, _
0)
If dwMessageLength = 0 Then
GetErrorText = ""
Else
ReDim bBuffer(dwMessageLength + dwMessageLength + 2)
Call lstrcpy(bBuffer(0), lpBuffer)
GetErrorText = bBuffer
Erase bBuffer
Call LocalFree(lpBuffer)
End If
End Function