The following works for me on ActivePerl v5.6.1 on Win2k. It appears to be the minimal solution.
use Win32::Shortcut ();
my $s = Win32::Shortcut->new();
$s->Path('C:\\TEMP');
$s->Save('C:\\TEMP.lnk');
# Test the shortcut.
# Make sure C:\TEMP exists.
# Make sure you have no windows displaying C:\TEMP.
system('start "C:\\TEMP.lnk"');
The above was extracted from the following longer test:
use strict;
use warnings;
use Win32::Shortcut ();
# Examine existing shortcut to C:\WINNT.
my $s1 = Win32::Shortcut->new();
$s1->Load('C:\\WINNT.lnk');
print map { my $key = $_;
my $val = $s1->$key();
sprintf("%-17s %s\n",
"$key:",
defined $val ? $val : '[undef]'
) }
qw( Path
ShortPath
Arguments
WorkingDirectory
Description
ShowCmd
Hotkey
IconLocation
IconNumber );
# Clone existing shortcut to C:\WINNT.
my $s2 = Win32::Shortcut->new();
do {
my $key = $_;
my $val = $s1->$key();
$s2->$key($val);
} foreach qw( Path
ShortPath
Arguments
WorkingDirectory
Description
ShowCmd
Hotkey
IconLocation
IconNumber );
$s2->Save('C:\\WINNT2.lnk');
system('start "C:\\WINNT2.lnk"');
# Create new shortcut to C:\TEMP.
my $s3 = Win32::Shortcut->new();
$s3->Path('C:\\TEMP');
$s3->Save('C:\\TEMP.lnk');
system('start "C:\\TEMP.lnk"');