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.

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

Reply via email to