In my programs I use this code quite often:

SysErrorMessage(GetLastError);

But recently my program had a range check
error which let me have a look at the definiton
of the 2 functions GetLastError and SysErrorMessage.
GetLastError is from the WinAPI:

-----------------------------------------------------------
function GetLastError:DWORD; external 'kernel32' name 'GetLastError';
-----------------------------------------------------------

and SysErrorMessage is from SysUtils:

-----------------------------------------------------------
function SysErrorMessage(ErrorCode: Integer): String;
const MaxMsgSize = Format_Message_Max_Width_Mask;
var   MsgBuffer: pChar;

begin
GetMem(MsgBuffer, MaxMsgSize);
FillChar(MsgBuffer^, MaxMsgSize, #0);
FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM,
               nil,
               ErrorCode,                              <----- 3rd Parameter
               MakeLangId(LANG_NEUTRAL, SUBLANG_DEFAULT),
               MsgBuffer,                 { This function allocs the memory }
               MaxMsgSize,                           { Maximum message size }
               nil);
SysErrorMessage := StrPas(MsgBuffer);
FreeMem(MsgBuffer, MaxMsgSize);
end;
-----------------------------------------------------------

GetLastError yields a DWORD but SysErrorMessage expects an INTEGER.
Why? This raises a range check for all error codes >2^31.

A closer look at SysErrorMessage shows that the ERRORCODE will
not be used in this routine but only handed over to
FormatMessageA which expects a DWORD!

-----------------------------------------------------------
function FormatMessageA(dwFlags:DWORD;
                        lpSource:LPCVOID;
                        dwMessageId:DWORD;            <----- 3rd Parameter
                        dwLanguageId:DWORD;
                        lpBuffer:LPSTR;
                        nSize:DWORD;
                        Arguments:va_list):DWORD; external 'kernel32' name 
'FormatMessageA';
-----------------------------------------------------------

So if GetLastError gives a DWORD and FormatMessageA expects a DWORD
shouldn't SysErrorMessage use a DWORD too?



_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to