use Win32::Shortcut;Then, use this command to create a shortcut object:
$LINK = new Win32::Shortcut();This function will create a $LINK object on which you can apply the Methods and Properties explained later.
The object is not yet a shortcut file; it is just the definition of a shortcut. Basically, you can do 2 things:
For the rest, the object can be accessed as it were a normal associative array reference. It has the following keys (here referred as properties):$LINK->{'File'} $LINK->{'Path'} $LINK->{'ShortPath'} $LINK->{'WorkingDirectory'} $LINK->{'Arguments'} $LINK->{'Description'} $LINK->{'ShowCmd'} $LINK->{'Hotkey'} $LINK->{'IconLocation'} $LINK->{'IconNumber'}Thus, assuming you have a shortcut file named test.lnk in your current directory, this simple script will tell you where this shortcut points to:
use Win32::Shortcut; $LINK=new Win32::Shortcut(); $LINK->Load("test.lnk"); print "Shortcut to: $LINK->{'Path'} $LINK->{'Arguments'} \n"; $LINK->Close();But you can also modify its values:
use Win32::Shortcut; $LINK=new Win32::Shortcut(); $LINK->Load("test.lnk"); $LINK->{'Path'}=~s/C:/D:/i; # move the target from C: to D: $LINK->{'ShowCmd'}=SW_NORMAL; # runs in a normal windowand then you can save your changes to the shortcut file with this command:
$LINK->Save(); $LINK->Close();or you can save it with another name, creating a new shortcut file:
$LINK->Save("test2.lnk"); $LINK->Close();Finally, you can create a completely new shortcut:
$LINK=new Win32::Shortcut(); $LINK->{'Path'}="C:\PERL5\BIN\PERL.EXE"; $LINK->{'Arguments'}="-v"; $LINK->{'WorkingDirectory'}="C:\PERL5\BIN"; $LINK->{'Description'}="Prints out the version of Perl"; $LINK->{'ShowCmd'}=SW_SHOWMAXIMIZED; $LINK->Save("Perl Version Info.lnk"); $LINK->Close();Note also that in the examples above the two lines:
$LINK=new Win32::Shortcut(); $LINK->Load("test.lnk");can be collapsed to:
$LINK=new Win32::Shortcut("test.lnk");
$LINK->Close();
$LINK->Load("test.lnk") or print "test.lnk not found!"; print join("\n",$LINK->{'Path'}, $LINK->{'ShortPath'}, $LINK->{'Arguments'}, $LINK->{'WorkingDirectory'}, $LINK->{'Description'}, $LINK->{'ShowCmd'}, $LINK->{'Hotkey'}, $LINK->{'IconLocation'}, $LINK->{'IconNumber'}); }
$LINK = new Win32::Shortcut(); $RegEdit = new Win32::Shortcut("Registry Editor.lnk"); die "File not found" if not $RegEdit;
# if the target doesn't exist... if(! -f $LINK->{'Path'}) { # save the actual target for comparison $oldpath = $LINK->{'Path'}; # try to resolve it (with dialog box) $newpath = $LINK->Resolve(0); die "Not resolved..." if $newpath == $oldpath; }
$LINK->Save(); $LINK->Save("Copy of ".$LINK->{'File'});
$LINK->Set("C:\PERL5\BIN\PERL.EXE", "-v", "C:\PERL5\BIN", "Prints out the version of Perl", SW_SHOWMAXIMIZED, hex('0x0337'), "C:\WINDOWS\SYSTEM\COOL.DLL", 1); # it is the same of... $LINK->{'Path'}="C:\PERL5\BIN\PERL.EXE"; $LINK->{'Arguments'}="-v"; $LINK->{'WorkingDirectory'}="C:\PERL5\BIN"; $LINK->{'Description'}="Prints out the version of Perl"; $LINK->{'ShowCmd'}=SW_SHOWMAXIMIZED; $LINK->{'Hotkey'}=hex('0x0337'); $LINK->{'IconLocation'}="C:\WINDOWS\SYSTEM\COOL.DLL"; $LINK->{'IconNumber'}=1;
$OBJECT->{'property'}Eg., assuming that you have created a shortcut object with:
$LINK=new Win32::Shortcut();you can for example see its description with:
print $LINK->{'Description'};You can of course also set it:
$LINK->{'Description'}="This is a description";From version 0.02, those properties have also a corresponding method (subroutine), so you can write the 2 lines above using this syntax too:
print $LINK->Description; $LINK->Description("This is a description");The properties of a shortcut reflect the content of the Shortcut Properties Dialog Box, which can be obtained by clicking the third mouse button on a shortcut file in the Windows 95 (or NT 4.0) Explorer and choosing "Properties" (well, I hope you already knew :).
Value | Meaning | Constant |
1 | Normal Window | SW_SHOWNORMAL |
3 | Maximized | SW_SHOWMAXIMIZED |
7 | Minimized | SW_SHOWMINNOACTIVE |
Any other value (theoretically should) result in a Normal Window display.