[fpc-pascal] Getting multiple files from GetOpenFileNameA

Santiago A. svaa at ciberpiula.net
Thu May 23 21:50:12 CEST 2019


El 23/05/19 a las 13:52, James Richters escribió:
>
> I have put together a program that demonstrates the issue I am 
> having.  I have re-structured it a bit to try to make it more clear 
> where the problem is.
>
> While putting this together, I was able to get it to run fine with no 
> problems if I did not try to put GetOpenFileNameA back to the 
> directory of the last file I processed. Including a file sent in as a 
> parameter.   If I set Open_File.lpstrFile:=Pchar(Target_File+#0+#0); 
> where Target_File is the complete path and file name of the last file 
> I processed,  If I select only one file, then the next time around it 
> DOES work.. and will put me in the directory of Target_File and will 
> show the filename of Target_File as a default, but if I select more 
> than one file, the next time around, it crashes.. I have detailed the 
> crash information in the sameple program comments.
>
> Another way I wish to run this is to leave Open_File.lpstrFile alone 
> and use Open_File.lpstrInitialDir to put me in the directory of the 
> last processed file, but not specify a default filename.  I can’t get 
> this to work correctly at all, but if I use Open_File.lpstrInitialDir 
> without Open_File.lpstrFile then it does not crash,  I am just not put 
> in the directory I expect to be in.
>
> Any Advice or suggestions on any of this, or on how I could improve 
> the structure or methods of this program are greatly appreciated.
>

At the beginning you set
Open_File.lpstrFile:=ret;

That is right Open_File.lpstrFile points to "ret", and "ret" is an array 
of 100000, a good buffer.


The problem is here:

Open_File.lpstrFile:=Pchar(Target_File+#0+#0);

That is wrong. Now Open_File.lpstrFile doesn't point to "ret" anymore, 
now it points to a string with length(Target_File)+2. But 
Open_File.nMaxFile:=100000, so the GetOpenFileNameA thinks there is 
plenty of room, so rises no error and overwrites whatever is after 
Target_File+#0+#0.

instead of

Open_File.lpstrFile:=Pchar(Target_File+#0+#0);

write

ret:=Pchar(Target_File+#0)

You should initialize to "ret" in each loop, in fact, it should be 
initialized inside the procedure. and Open_File.lpstrFilter:='All Files 
(*.*)'+#0+'*.*'+#0; needs an extra #0;


In addition, just for style, instead of

Open_File.nMaxFile:=100000
write
Open_File.nMaxFile:=sizeOf(ret);

And why are all those variables global if they are only used inside the 
procedure?

And instead of this

Filenum:=0;

             Repeat

Inc(Filenum);

                If (Filenum<File_Stringlist.Count) Then

Begin

      Target_File:=File_Stringlist[0];

If Target_File[Length(Target_File)]<>'\' Then

Target_File:=Target_File+'\';

Target_File:=Target_File+File_Stringlist[Filenum];

Process_File(Target_File);

End;

             Until Filenum>=File_Stringlist.Count;


Replace with

Target_File:=IncludeTrailingPathDelimiter(File_Stringlist[0]);

             for file_num:=1 to File_Stringlist.count-1 do

Process_File(Target_File+File_Stringlist[Filenum]);


FOR is you friend


-- 
Saludos

Santiago A.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-pascal/attachments/20190523/bde98c78/attachment.html>


More information about the fpc-pascal mailing list