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