You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
352 lines
8.8 KiB
352 lines
8.8 KiB
package Win32::Shortcut;
|
|
#######################################################################
|
|
#
|
|
# Win32::Shortcut - Perl Module for Shell Link Interface
|
|
# ^^^^^^^^^^^^^^^
|
|
# This module creates an object oriented interface to the Win32
|
|
# Shell Links (IShellLink interface).
|
|
#
|
|
# Version: 0.03 (07 Apr 1997)
|
|
#
|
|
#######################################################################
|
|
|
|
require Exporter; # to export the constants to the main:: space
|
|
require DynaLoader; # to dynuhlode the module.
|
|
|
|
@ISA= qw( Exporter DynaLoader );
|
|
@EXPORT = qw(
|
|
SW_SHOWMAXIMIZED
|
|
SW_SHOWMINNOACTIVE
|
|
SW_SHOWNORMAL
|
|
);
|
|
|
|
|
|
#######################################################################
|
|
# This AUTOLOAD is used to 'autoload' constants from the constant()
|
|
# XS function. If a constant is not found then control is passed
|
|
# to the AUTOLOAD in AutoLoader.
|
|
#
|
|
|
|
sub AUTOLOAD {
|
|
my($constname);
|
|
($constname = $AUTOLOAD) =~ s/.*:://;
|
|
#reset $! to zero to reset any current errors.
|
|
$!=0;
|
|
my $val = constant($constname, @_ ? $_[0] : 0);
|
|
if ($! != 0) {
|
|
|
|
# [dada] This results in an ugly Autoloader error
|
|
|
|
#if ($! =~ /Invalid/) {
|
|
# $AutoLoader::AUTOLOAD = $AUTOLOAD;
|
|
# goto &AutoLoader::AUTOLOAD;
|
|
#} else {
|
|
|
|
# [dada] ... I prefer this one :)
|
|
|
|
($pack, $file, $line) = caller;
|
|
undef $pack; # [dada] and get rid of "used only once" warning...
|
|
die "Win32::Shortcut::$constname is not defined, used at $file line $line.";
|
|
|
|
#}
|
|
}
|
|
eval "sub $AUTOLOAD { $val }";
|
|
goto &$AUTOLOAD;
|
|
}
|
|
|
|
|
|
#######################################################################
|
|
# STATIC OBJECT PROPERTIES
|
|
#
|
|
$VERSION = "0.03";
|
|
|
|
#######################################################################
|
|
# PUBLIC METHODS
|
|
#
|
|
|
|
#======== ### CLASS CONSTRUCTOR
|
|
sub new {
|
|
#========
|
|
my($class, $file) = @_;
|
|
my $self = {};
|
|
my $ilink = 0;
|
|
my $ifile = 0;
|
|
|
|
($ilink, $ifile) = _Instance();
|
|
|
|
if($ilink and $ifile) {
|
|
$self->{'ilink'} = $ilink;
|
|
$self->{'ifile'} = $ifile;
|
|
bless $self;
|
|
# Initialize properties
|
|
$self->{'File'} = "";
|
|
$self->{'Path'} = "";
|
|
$self->{'Arguments'} = "";
|
|
$self->{'WorkingDirectory'} = "";
|
|
$self->{'Description'} = "";
|
|
$self->{'ShowCmd'} = 0;
|
|
$self->{'Hotkey'} = 0;
|
|
$self->{'IconLocation'} = "";
|
|
$self->{'IconNumber'} = 0;
|
|
|
|
$self->Load($file) if $file;
|
|
|
|
} else {
|
|
return undef;
|
|
}
|
|
$self;
|
|
}
|
|
|
|
#=========
|
|
sub Load {
|
|
#=========
|
|
my($self, $file) = @_;
|
|
return undef unless ref($self);
|
|
|
|
my $result = _Load($self->{'ilink'}, $self->{'ifile'}, $file);
|
|
|
|
if(defined($result)) {
|
|
|
|
# fill the properties of $self
|
|
$self->{'File'} = $file;
|
|
$self->{'Path'} = _GetPath($self->{'ilink'}, $self->{'ifile'},0);
|
|
$self->{'ShortPath'} = _GetPath($self->{'ilink'}, $self->{'ifile'},1);
|
|
$self->{'Arguments'} = _GetArguments($self->{'ilink'}, $self->{'ifile'});
|
|
$self->{'WorkingDirectory'} = _GetWorkingDirectory($self->{'ilink'}, $self->{'ifile'});
|
|
$self->{'Description'} = _GetDescription($self->{'ilink'}, $self->{'ifile'});
|
|
$self->{'ShowCmd'} = _GetShowCmd($self->{'ilink'}, $self->{'ifile'});
|
|
$self->{'Hotkey'} = _GetHotkey($self->{'ilink'}, $self->{'ifile'});
|
|
($self->{'IconLocation'},
|
|
$self->{'IconNumber'}) = _GetIconLocation($self->{'ilink'}, $self->{'ifile'});
|
|
}
|
|
return $result;
|
|
}
|
|
|
|
|
|
#========
|
|
sub Set {
|
|
#========
|
|
my($self, $path, $arguments, $dir, $description, $show, $hotkey,
|
|
$iconlocation, $iconnumber) = @_;
|
|
return undef unless ref($self);
|
|
|
|
$self->{'Path'} = $path;
|
|
$self->{'Arguments'} = $arguments;
|
|
$self->{'WorkingDirectory'} = $dir;
|
|
$self->{'Description'} = $description;
|
|
$self->{'ShowCmd'} = $show;
|
|
$self->{'Hotkey'} = $hotkey;
|
|
$self->{'IconLocation'} = $iconlocation;
|
|
$self->{'IconNumber'} = $iconnumber;
|
|
return 1;
|
|
}
|
|
|
|
|
|
#=========
|
|
sub Save {
|
|
#=========
|
|
my($self, $file) = @_;
|
|
return undef unless ref($self);
|
|
|
|
return undef if not $file and not $self->{'File'};
|
|
$file = $self->{'File'} if not $file;
|
|
|
|
_SetPath($self->{'ilink'}, $self->{'ifile'}, $self->{'Path'});
|
|
_SetArguments($self->{'ilink'}, $self->{'ifile'}, $self->{'Arguments'});
|
|
_SetWorkingDirectory($self->{'ilink'}, $self->{'ifile'}, $self->{'WorkingDirectory'});
|
|
_SetDescription($self->{'ilink'}, $self->{'ifile'}, $self->{'Description'});
|
|
_SetShowCmd($self->{'ilink'}, $self->{'ifile'}, $self->{'ShowCmd'});
|
|
_SetHotkey($self->{'ilink'}, $self->{'ifile'}, $self->{'Hotkey'});
|
|
_SetIconLocation($self->{'ilink'}, $self->{'ifile'},
|
|
$self->{'IconLocation'}, $self->{'IconNumber'});
|
|
|
|
my $result = _Save($self->{'ilink'}, $self->{'ifile'}, $file);
|
|
return $result;
|
|
}
|
|
|
|
#============
|
|
sub Resolve {
|
|
#============
|
|
my($self, $flags) = @_;
|
|
return undef unless ref($self);
|
|
$flags = 1 unless defined($flags);
|
|
my $result = _Resolve($self->{'ilink'}, $self->{'ifile'}, $flags);
|
|
return $result;
|
|
}
|
|
|
|
|
|
#==========
|
|
sub Close {
|
|
#==========
|
|
my($self) = @_;
|
|
return undef unless ref($self);
|
|
|
|
my $result = _Release($self->{'ilink'}, $self->{'ifile'});
|
|
$self->{'released'} = 1;
|
|
return $result;
|
|
}
|
|
|
|
#=========
|
|
sub Path {
|
|
#=========
|
|
my($self, $value) = @_;
|
|
return undef unless ref($self);
|
|
|
|
if(not defined($value)) {
|
|
return $self->{'Path'};
|
|
} else {
|
|
$self->{'Path'} = $value;
|
|
}
|
|
return $self->{'Path'};
|
|
}
|
|
|
|
#==============
|
|
sub ShortPath {
|
|
#==============
|
|
my($self) = @_;
|
|
return undef unless ref($self);
|
|
return $self->{'ShortPath'};
|
|
}
|
|
|
|
#==============
|
|
sub Arguments {
|
|
#==============
|
|
my($self, $value) = @_;
|
|
return undef unless ref($self);
|
|
|
|
if(not defined($value)) {
|
|
return $self->{'Arguments'};
|
|
} else {
|
|
$self->{'Arguments'} = $value;
|
|
}
|
|
return $self->{'Arguments'};
|
|
}
|
|
|
|
#=====================
|
|
sub WorkingDirectory {
|
|
#=====================
|
|
my($self, $value) = @_;
|
|
return undef unless ref($self);
|
|
|
|
if(not defined($value)) {
|
|
return $self->{'WorkingDirectory'};
|
|
} else {
|
|
$self->{'WorkingDirectory'} = $value;
|
|
}
|
|
return $self->{'WorkingDirectory'};
|
|
}
|
|
|
|
|
|
#================
|
|
sub Description {
|
|
#================
|
|
my($self, $value) = @_;
|
|
return undef unless ref($self);
|
|
|
|
if(not defined($value)) {
|
|
return $self->{'Description'};
|
|
} else {
|
|
$self->{'Description'} = $value;
|
|
}
|
|
return $self->{'Description'};
|
|
}
|
|
|
|
#============
|
|
sub ShowCmd {
|
|
#============
|
|
my($self, $value) = @_;
|
|
return undef unless ref($self);
|
|
|
|
if(not defined($value)) {
|
|
return $self->{'ShowCmd'};
|
|
} else {
|
|
$self->{'ShowCmd'} = $value;
|
|
}
|
|
return $self->{'ShowCmd'};
|
|
}
|
|
|
|
#===========
|
|
sub Hotkey {
|
|
#===========
|
|
my($self, $value) = @_;
|
|
return undef unless ref($self);
|
|
|
|
if(not defined($value)) {
|
|
return $self->{'Hotkey'};
|
|
} else {
|
|
$self->{'Hotkey'} = $value;
|
|
}
|
|
return $self->{'Hotkey'};
|
|
}
|
|
|
|
#=================
|
|
sub IconLocation {
|
|
#=================
|
|
my($self, $value) = @_;
|
|
return undef unless ref($self);
|
|
|
|
if(not defined($value)) {
|
|
return $self->{'IconLocation'};
|
|
} else {
|
|
$self->{'IconLocation'} = $value;
|
|
}
|
|
return $self->{'IconLocation'};
|
|
}
|
|
|
|
#===============
|
|
sub IconNumber {
|
|
#===============
|
|
my($self, $value) = @_;
|
|
return undef unless ref($self);
|
|
|
|
if(not defined($value)) {
|
|
return $self->{'IconNumber'};
|
|
} else {
|
|
$self->{'IconNumber'} = $value;
|
|
}
|
|
return $self->{'IconNumber'};
|
|
}
|
|
|
|
#============
|
|
sub Version {
|
|
#============
|
|
# [dada] to get rid of the "used only once" warning...
|
|
return $VERSION;
|
|
}
|
|
|
|
|
|
#######################################################################
|
|
# PRIVATE METHODS
|
|
#
|
|
|
|
#============ ### CLASS DESTRUCTOR
|
|
sub DESTROY {
|
|
#============
|
|
my($self) = @_;
|
|
|
|
if(not $self->{'released'}) {
|
|
_Release($self->{'ilink'}, $self->{'ifile'});
|
|
}
|
|
}
|
|
|
|
#======== ### PACKAGE DESTRUCTOR
|
|
sub END {
|
|
#========
|
|
# print "Exiting...\n";
|
|
_Exit();
|
|
}
|
|
|
|
#######################################################################
|
|
# dynamically load in the Shortcut.pll module.
|
|
#
|
|
|
|
bootstrap Win32::Shortcut;
|
|
|
|
# Preloaded methods go here.
|
|
|
|
#Currently Autoloading is not implemented in Perl for win32
|
|
# Autoload methods go after __END__, and are processed by the autosplit program.
|
|
|
|
1;
|
|
__END__
|
|
|