GetLastError is a number. What does it mean?

A customer asked

I'm getting an error 12 back from a GetLastError call, and I've seen a number of sites that tell me I can figure out what that error is by sending it to SysErrorMessage. But nothing I've seen shows how to declare SysErrorMessage. It doesn't appear to be in Kernal32 because I get an error if I try to DECLARE it there. Where does this API live?

Understanding an error number from GetLastError() is probably useful. If you have Visual Studio installed, these errors are defined in

C:\Program Files\Microsoft Visual Studio .NET 2003\Vc7\PlatformSDK\Include\WinError.h

For error 12, that files says:

//

// MessageId: ERROR_INVALID_ACCESS

//

// MessageText:

//

// The access code is invalid.

//

#define ERROR_INVALID_ACCESS 12L

You can also start VS and choose Tools->Error Lookup

I haven’t heard of the “SysErrorMessage” function and a search of MSDN turns up nothing. There are a few mentions of it from internet searches. Perhaps it is outdated.

To turn an error number into English text, you can use the FormatMessage function. A parameter specifies what language the string should be. For that, we call GetSystemDefaultLangID

#define FORMAT_MESSAGE_ALLOCATE_BUFFER 0x00000100

#define FORMAT_MESSAGE_IGNORE_INSERTS 0x00000200

#define FORMAT_MESSAGE_FROM_STRING 0x00000400

#define FORMAT_MESSAGE_FROM_HMODULE 0x00000800

#define FORMAT_MESSAGE_FROM_SYSTEM 0x00001000

#define FORMAT_MESSAGE_ARGUMENT_ARRAY 0x00002000

#define FORMAT_MESSAGE_MAX_WIDTH_MASK 0x000000FF

DECLARE integer GetSystemDefaultLangID IN win32api

DECLARE integer FormatMessage IN WIN32API integer dwFlags,;

      integer lpSource,;

      integer dwMessageId,;

      integer dwLanguageId,;

      string @ lpBuffer,;

      integer nSize

langid=BITAND(0xffff,GetSystemDefaultLangID())

?TRANSFORM(langid,"@0x")

nErr=122

cstr=SPACE(1024)

nlen=FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0,nErr,langid, @cstr, LEN(cstr))

IF nlen>0

      cErr=LEFT(cstr,nlen)

      ?"Message=",cErr

ENDIF