[fpc-pascal] GetSaveFileNameA limited to 100 characters in default name

Alexander Grotewohl alex at dcclost.com
Mon Jun 21 20:41:25 CEST 2021


It's best to think of these in two parts. The Windows API part and then the interfacing with Pascal part.

SaveAsFileName.lpstrFile = long pointer to a (C) string filename buffer

This buffer isn't created for you, you provide it and tell Windows it's size.

If you were to just do

StrPLCopy( SaveAsFileName.lpstrFile, DefaulSaveAsFileName, Max_Path+1);

there is no buffer there to receive DefaultSaveAsFileName. (or more correctly the lpstrFile pointer will point to random memory).

So, you first create the buffer, StrPLCopy the default string into it, and then pass it to the Windows API.

On return, it uses that same buffer (Windows doesn't have to create the buffer because you did) and knows the maximum it can place into the buffer (because you provided that information).

Afterwards you can take that buffer (a C-string) and convert it to something Pascal-like again.

This is important because almost everything you do with the Windows API will be some variant of this procedure and you need to be able to repeat this every time you use it without bugs 🙂

--
Alexander Grotewohl
https://dcclost.com
________________________________
From: fpc-pascal <fpc-pascal-bounces at lists.freepascal.org> on behalf of James Richters via fpc-pascal <fpc-pascal at lists.freepascal.org>
Sent: Monday, June 21, 2021 1:56 PM
To: 'FPC-Pascal users discussions' <fpc-pascal at lists.freepascal.org>
Cc: James Richters <james.richters at productionautomation.net>; 'Jean SUZINEAU' <jean.suzineau at wanadoo.fr>
Subject: Re: [fpc-pascal] GetSaveFileNameA limited to 100 characters in default name

>I would prefer to use
> StrPLCopy( SaveAsFileNameBuffer, DefaulSaveAsFileName,
SizeOf(SaveAsFileNameBuffer));
>instead of
>  SaveAsFileNameBuffer:=Pchar(DefaulSaveAsFileName);

I'm curious what the difference is between StrPLCopy() and PChar()

I wonder if PChar() was my problem.. maybe I don't need the buffer, maybe I
just needed:
StrPLCopy( SaveAsFileName.lpstrFile, DefaulSaveAsFileName, Max_Path+1);
?

James

_______________________________________________
fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20210621/eebbb1d4/attachment.htm>


More information about the fpc-pascal mailing list