-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

same goes for GetSaveFileName.

NB:
also if you're a pedant (like me) then you can change
filterlen += 2, to filterlen++ (so long as you change the pointer 
stuff), and save a _whole_ byte of memory (for about 15 seconds).

> Sorry about essentially spamming this newsgroup, but I have a fix 
> for the following problem (if anyone else is ever actually effected by 
> it).
> 
> in the GetOpenFileName XSUB; change to following code:
>                     int i, filterlen;
>                     char *fpointer;
>                     filters = (AV*)SvRV(ST(next_i));
>                     for(i=0; i<=av_len(filters); i++) {
>                         t = av_fetch(filters, i, 0);
>                         if(t != NULL) {
>                             filterlen += SvCUR(*t) + 1;
>                         }
>                     }
> to:
>                     int i, filterlen = 0;             /* <---- must 
> initialize this */
>                     char *fpointer;
>                     filters = (AV*)SvRV(ST(next_i));
>                     for(i=0; i<=av_len(filters); i++) {
>                         t = av_fetch(filters, i, 0);
>                         if(t != NULL) {
>                             filterlen += SvCUR(*t) + 1;
>                         }
>                     }
> 
> also (and _please_ correct me if I'm wrong) I've changed the 
> following code a little, as I disagree with the pointer arithmetic.
> 
>                     filterlen += 2;
>                     filter = (char *) safemalloc(filterlen);
>                     fpointer = filter;
>                     for(i=0; i<=av_len(filters); i++) {
>                         t = av_fetch(filters, i, 0);
>                         if(t != NULL) {
>                             strcpy(fpointer, SvPV_nolen(*t));
>                             fpointer += SvCUR(*t);                            
> /* no + 1 */
>                             *fpointer++ = 0;                  /* changed */
>                         }
> 
>                     }
>                     *fpointer = 0;                            /* changed */
>                     ofn.lpstrFilter = (LPCTSTR) filter;
> 
> hope this helps someone. If not then sorry for the needless traffic.
> 
> > can anyone out there recreate this:
> > 
> > from perl call
> > my $filename = Win32::GUI::GetOpenFileName(
> >     -filter => [
> >             "File type 1" => "*.ft1",
> >             "File type 2" => "*.ft2",
> >     ],
> > );
> > 
> > now call this twice. The first time it works wonderfully, the second 
> > time it causes my program to exit, and this is displayed:
> > Out of memory!
> > Callback called exit.
> > (I believe the message is from the perl interpreter rather than win32-
> > gui).
> > 
> > I'd be interested to hear if anyone is using this function with 
> > success (multiple times), as it may be a problem purely with my 
> > build of win32-gui (0.0502) or perl (5.60).
> > 
> > It doesn't seem to happen unless you specify a filter. All the other 
> > options work perfectly.
> > 
> > Sam Jacobson
> > R & D Manager / Software Engineer
> > Selective Communications
> > Ph +64 9 302 1142
> > www.selective.co.nz
> > 
> > _______________________________________________
> > Perl-Win32-GUI-Users mailing list
> > Perl-Win32-GUI-Users@lists.sourceforge.net
> > http://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users
> > 
> >
> 
> Sam Jacobson
> R & D Manager / Software Engineer
> Selective Communications
> Ph +64 9 302 1142
> www.selective.co.nz
> 
> _______________________________________________
> Perl-Win32-GUI-Users mailing list
> Perl-Win32-GUI-Users@lists.sourceforge.net
> http://lists.sourceforge.net/lists/listinfo/perl-win32-gui-users
> 
> 



-----BEGIN PGP SIGNATURE-----
Version: N/A

iQA/AwUBOlyX45sRND2Z+TaWEQIEAACcCwaE+SlILJnPMgDI6oX99+27yg0An1ig
Y4DrESrVnnx4uF4kHJ3oRD7r
=AdVr
-----END PGP SIGNATURE-----

Sam Jacobson
R & D Manager / Software Engineer
Selective Communications
Ph +64 9 302 1142
www.selective.co.nz

Reply via email to