[fpc-pascal]Win32 API Call

Thomas Schatzl tom_at_work at yline.com
Sat Dec 8 14:58:48 CET 2001


Hi,

> > But is that why you're using the @ symbol for BytesFree? Somehow I get
the
> > feeling you're going to tell me no. And if you do, then how come the
Win32
> > Reference says all the values are pularge_integer but only ones need to
be
> > referenced by it's address?
>
> [error in redef.inc]
>
>This is not equivalent to what Windows expects: the first two parameters,
>lpFreeBytesAvailableToCaller and lpTotalNumberOfBytes are declared as
>untyped var parameters (generic pointers), while the third parameter,
>lpTotalNumberOfFreeBytes is a pointer to a large integer. The Win32 API, in
>contrast to this, specifies all three parameters as pointers to large
>integers, hence the need to change the semicolon after lpTotalNumberOfBytes
>to a comma.

Well, but you forget that the third param is optional, e.g. can be nil.

>If this is corrected, you don't have to use the '@' operator before the
>third parameter any more.

No, because the third parameter is optional, e.g. can be null. By using a
'var' parameter you'd force the programmer to always declare a (probably
dummy-) variable for the third param which limits your options to use that
function. A completely correct translation for the Pascal language (imo):

function GetDiskFreeSpaceEx(lpDirectoryName: PChar; var
lpFreeBytesAvailableToCaller, lpTotalNumberOfBytes : LargeInteger;
lpTotalNumberOfFreeBytes: PLargeInteger): BOOL;external 'kernel32' name
'GetDiskFreeSpaceExA';

This forces the programmer to use a large integer as mentioned in the MS
docs for the first two params but still allows for 'nil' for the third param
and preserving the option to ignore the result of lpTotalNumberOfFreeBytes,
e.g. not requiring you to declare never used dummy variables in your calling
program.

Regards,
  Thomas






More information about the fpc-pascal mailing list