The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl -w
use strict;
use warnings;
use Win32::GUI();

# This sample demonstrates GetOpenFileName

my $lastfile = 'foo.bar';

# single file with graphics file filters

{
my ( @file, $file );
my ( @parms );
push @parms,
  -filter =>
    [ 'TIF - Tagged Image Format', '*.tif',
      'BMP - Windows Bitmap', '*.bmp',
      'GIF - Graphics Interchange Format', '*.gif',
      'JPG - Joint Photographics Experts Group', '*.jpg',
      'All Files - *', '*'
    ],
  -directory => "c:\\program files",
  -title => 'Select a file';
push @parms, -file => $lastfile  if $lastfile;
@file = Win32::GUI::GetOpenFileName ( @parms );
print "$_\n" for @file;
print "index of null:", index( $file[ 0 ], "\0" ), "\n";
print "index of space:", index( $file[ 0 ], " " ), "\n";
}

# allow multiple files, only one filter
{
my ( @file, $file );
my ( @parms );
push @parms,
  -multisel => 10, # use 40000 byte buffer
  -filter =>
    [ 'All Files - *', '*'
    ],
  -directory => "c:\\program files",
  -title => 'Select a file';
push @parms, -file => $lastfile  if $lastfile;
@file = Win32::GUI::GetOpenFileName ( @parms );
print "$_\n" for @file;
print "index of null:", index( $file[ 0 ], "\0" ), "\n";
print "index of space:", index( $file[ 0 ], " " ), "\n";
}

# old style dialog, multiple file selection enabled, no filters.
# User has to type in a filter, to see anything.  Always good to have a
# filter.  But it isn't required....
{
my ( @file, $file );
my ( @parms );
push @parms, 
  -multisel => 1, # use 4000 byte buffer
  -explorer => 0,
  -directory => "c:\\program files",
  -title => 'Select a file';
push @parms, -file => $lastfile  if $lastfile;
@file = Win32::GUI::GetOpenFileName ( @parms );
print "$_\n" for @file;
print "index of null:", index( $file[ 0 ], "\0" ), "\n";
print "index of space:", index( $file[ 0 ], " " ), "\n";
}