[fpc-pascal] Syserrormessage, parameter data type

Michael Van Canneyt michael at freepascal.org
Sun Oct 5 12:10:35 CEST 2014



On Sat, 4 Oct 2014, Jürgen Hestermann wrote:

> In my programs I use this code quite often:
>
> SysErrorMessage(GetLastError);
>
> 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?

Not necessarily, because it is a cross-platform function and on other systems the error codes are not necessarily positive values.
Unfortunately, this kind of windows-api-creep is found throughout the RTL.

The proper procedure is probably to introduce TSysErrorCode which depends on the platform, and replace integer/dword with that.
Please file a bug-report, so we do not forget this.

Michael.


More information about the fpc-pascal mailing list