It's curious, I'm not completely sure we are reasoning about the same function and record.

You mention TFileName but for me in FPC 3.2.0:

-  TFileName is declared as "TFileName= type string;" in sysutilh.inc.

- OPENFILENAMEA is declared as record in CommDlg.pp line 94
  and TOPENFILENAMEA=OPENFILENAMEA;
  and POPENFILENAMEA=^OPENFILENAMEA;

-function GetSaveFileNameA is imported from Comdlg32.dll in CommDlg.pp line 595   function GetSaveFileNameA(_para1:LPOPENFILENAME):WINBOOL; stdcall; external 'comdlg32' name 'GetSaveFileNameA';

Le 19/06/2021 à 02:51, James Richters via fpc-pascal a écrit :
This got me thinking… my default filename is just a recommended default… but TFileName.lpstrFileis also what returns the filename to use, and the user could use the save-as dialog to add a directory, and change the name of the file to something else..etc… so the file name could be significantly larger than the default…
Yes

So I think I’m best off setting TFileName.nMaxFile:= Max_Path;then TFileName.lpstrFile will always be able to hold anything the operating system can support.

The nMaxFile value include the terminal null character, so it should be Max_Path+1, and it must be the size of the buffer lpstrFile is pointing to.

You shouldn't use "TFileName.lpstrFile:=Pchar(DefaultFileName);" because in this case lpstrFile will point to a buffer of size Length(DefaultFileName)+1 .

And to get the value back from the function, given a variable s: string, you should do something like s:= StrPas( TFileName.lpstrFile);

From Microsoft documentation:

nMaxFile
The size, in characters, of the buffer pointed to by lpstrFile. The buffer must be large enough to store the path and file name string or strings, including the terminating NULL character. The GetOpenFileName <https://docs.microsoft.com/en-us/windows/desktop/api/commdlg/nf-commdlg-getopenfilenamea> and GetSaveFileName <https://docs.microsoft.com/en-us/windows/desktop/api/commdlg/nf-commdlg-getsavefilenamea> functions return FALSE if the buffer is too small to contain the file information. The buffer should be at least 256 characters long.


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

Reply via email to