How often do you get really irritated searching around for the meaning behind API error codes? Well, there's a quick and simple way to obtain the error text for thousands of these codes, with one simple API call.
This is a little tool I put together to quickly identify the meaning of API error numbers. It provides a search-o-matic listbox with all defined API error messages. Also will paste onto the clipboard the required routine to obtain error messages on demand using
FormatMessage. This download now includes the full source for the utility, as well as a compiled (with VB5/SP3) EXE that I'll bet will end up on your
desktop, as it has mine. Also included is a drop-in BAS module you can add instantly to any project.
It can be frustrating looking up values returned by Err.LastDllError, to be sure. What's that? You use GetLastError? As much as I hate to tell you, that's really not very smart. You see, the way Microsoft designed VB, there's a whole lotta API calls going on behind your back There's no guarantee that calling GetLastError will result in that set by the API call
you made, as it could just as easily be referring to the return from an
API call the VB runtime made for you..
All 32-bit versions of Classic VB automatically call GetLastError on your
behalf, and store the returned value in Err.LastDllError, after every single API call that you
make. This is of course a horribly inefficient scheme, perhaps adding an additional 20% or more to the time required to make each and every API call. But, because of
UniMess™, there's really very few
options. The ideal answer would've been adding a parameter to API declarations
which would turn this generally unnecessary overhead off.
Here's the quick rundown on decoding API error messages.
Option Explicit
Private 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 Long) As Long
Private Const FORMAT_MESSAGE_FROM_SYSTEM As Long = &H1000
Private Function ApiErrorText(ByVal ErrNum As Long) As String
Dim msg As String
Dim nRet As Long
msg = Space$(1024)
nRet = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, ByVal 0&, _
ErrNum, 0&, msg, Len(msg), ByVal 0&)
If nRet Then
ApiErrorText = Left$(msg, nRet)
Else
ApiErrorText = "Error (" & ErrNum & ") not defined."
End If
End Function
The sample gets a little more involved by including messages contained in
netmsg.dll and wininet.dll, so for a full-fledged, drop-in ready module, grab
the whole thing below.