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

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
> 
> 



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

iQA/AwUBOlyUuZsRND2Z+TaWEQJORACfVCEfJBH6Ca1zEb6snziJsxUzetUAoN8+
PHUzaUdISWfzkjz3Z7b507iX
=BxIX
-----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