# Win32API::Const -- Basic API Constants
# Copyright (C) 1998 Brian Dellert: <aspider@pobox.com>, 206/689-6828,
# <http://www.applespider.com>
# Constants parsed from the egcs 1.1 header files Defines.h, Messages.h,
# Errors.h, Base.h, & Sockets.h
# This program is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by the
# Free Software Foundation; either version 2 of the License, or (at your
# option) any later version.
#
# This program is distributed in the hope that it will be useful, but
# WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
# or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program (gpl.license.txt); if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
package Win32API::Const;
use strict;
use Carp;
use vars qw($VERSION @ISA @EXPORT @EXPORT_OK $AUTOLOAD);
require DynaLoader;
require AutoLoader;
@ISA = qw(DynaLoader);
# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.
$VERSION = '0.011';
no strict 'refs';
sub AUTOLOAD {
# 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.
my $constname;
($constname = $AUTOLOAD) =~ s/.*:://;
if (@_) {
croak "Usage: Win32API::Const::$constname()";
}
croak "& not defined" if $constname eq 'constant';
my ($val, $error);
for my $const ($constname, "${constname}A") {
if (defined &$const) {
*$AUTOLOAD = \&{$const};
goto &$AUTOLOAD;
}
$val = constant($const);
$error = $!;
last unless $error;
if ($! =~ /Invalid/) {
$AutoLoader::AUTOLOAD = $AUTOLOAD;
goto &AutoLoader::AUTOLOAD;
}
}
if ($error) {
croak "Your vendor has not defined Win32API::Const macro $constname";
}
*$constname = sub {$val};
*$AUTOLOAD = \&{$constname};
goto &$AUTOLOAD;
}
use strict;
bootstrap Win32API::Const $VERSION;
no strict 'refs';
sub export {
my ($pkg, $callpkg, $imports) = @_;
return unless @$imports;
for my $sym (@$imports) {
if ($sym !~ s/^://) {
if (not defined &{"${pkg}::$sym"}) {
my $val = constant($sym);
if ($! != 0) {
if ($! =~ /Invalid/) {
$AutoLoader::AUTOLOAD = $AUTOLOAD;
goto &AutoLoader::AUTOLOAD;
}
else {
croak "Your vendor has not defined Win32API::Const macro $sym";
}
}
*{"${pkg}::$sym"} = sub { $val };
}
*{"${callpkg}::$sym"} = \&{"${pkg}::$sym"};
}
else {
my $all = $sym !~ /./;
for my $data_type (1..4) {
my ($start, $end) = $all ? constant_full_range($data_type) : constant_match_range($data_type, $sym);
next unless $start <= $end and $start >= 0;
for (my $i=$start; $i<=$end; ++$i) {
my ($name, $val) = constant_get($data_type, $i);
*{"${pkg}::$name"} = sub { $val } unless defined \&{"${pkg}::$name"};
*{"${callpkg}::$name"} = \&{"${pkg}::$name"};
}
}
}
}
}
sub import {
export (shift, scalar (caller), \@_);
}
use strict;
# Preloaded methods go here.
# Autoload methods go after =cut, and are processed by the autosplit program.
1;
__END__
# Below is the stub of documentation for your module. You better edit it!
=head1 NAME
Win32API::Const - Access Win32 constants such as WM_CLOSE, HELP_CONTENTS, etc.
=head1 SYNOPSIS
#
# Access value of WM_CLOSE without importing it
#
use Win32API::Const;
print "WM_CLOSE = ", Win32API::Const::WM_CLOSE(), "\n";
#
# Import and access values of WM_CLOSE and HELP_CONTENTS
#
use Win32API::Const qw(WM_CLOSE HELP_CONTENTS);
print "WM_CLOSE = ", WM_CLOSE(), "\n";
print "HELP_CONTENTS = ", HELP_CONTENTS(), "\n";
#
# Import WM_CLOSE, along with all constants whose names start with WS_ or SE_
#
use Win32API::Const qw(:WS_ WM_CLOSE :SE_);
print "WM_CLOSE = ", WM_CLOSE(), "\n";
print "WS_MAXIMIZE = ", WS_MAXIMIZE(), "\n";
print "WS_MINIMIZE = ", WS_MINIMIZE(), "\n";
print "WS_OVERLAPPED = ", WS_OVERLAPPED(), "\n";
print "SE_SHUTDOWN_NAME = ", SE_SHUTDOWN_NAME(), "\n";
=head1 DESCRIPTION
The Win32API::Const
module allows you to access the values of Win32 constants by name. Almost 6,000 constants are included --
these were parsed from the egcs 1.1 header files: Defines.h, Messages.h, Errors.h, Base.h, and Sockets.h.
Constant names and values were parsed from the egcs 1.1 Win32 header files (egcs is the free GNU
C/C++ compiler). You can download the Win32 version of egcs from
<ftp://ftp.xraylith.wisc.edu/pub/khan/gnu-win32/>.
A full list of Win32 constants and their meanings can be found in the documentation for your Win32
C/C++ compiler or in the Microsoft Developer Network (MSDN).
=head2 IMPORT A CONSTANT
To import a constant, specify its name on the C<use> line. For example, to import the constants
C<WM_CLOSE> and C<SE_SHUTDOWN_NAME>, do this:
use Win32API::Const qw(WM_CLOSE SE_SHUTDOWN_NAME);
Then, you can get the value of the constant by calling it like a subroutine.
my $value = WM_CLOSE();
print "The value of WM_CLOSE is: $value\n";
=head2 IMPORT A RANGE OF CONSTANTS
If you want to import all Win32 constants that start with, let's say, "WM_", then place
":WM_" in the import list. For example:
use Win32API::Const qw(:WM_);
print "The value of WM_CLOSE is: ", WM_CLOSE(), "\n";
print "The value of WM_HELP is: ", WM_HELP(), "\n";
You can import an individual constant and a range of constants on the same line. For example,
let's say you wan to import all the constants that start with C<WM_> and C<HELP_>, along with the
constant named C<SE_SHUTDOWN_NAME>.
use Win32API::Const qw(:WM_ SE_SHUTDOWN_NAME :HELP_);
The order you list stuff in the import list does not matter.
Note that importing C<:WM> is different than importing C<:WM_> (note the trailing underscore).
The former imports constants such as C<WMSZ_BOTTOM>, whereas the latter does not. It's up to you what you want to do.
=head2 USE A CONSTANT WITHOUT IMPORTING IT
You can still use a constant, even if you do not import it into your namespace -- heck, even
if you do not import I<any> constants into your namespace. Just call it like you would any
subroutine, and specify the full Win32API::Const package name.
use Win32API::Const;
print "WM_CLOSE = ", Win32API::Const::WM_CLOSE(), "\n";
=head1 COPYRIGHT
Win32API::Const -- Basic API Constants
Copyright (C) 1998 Brian Dellert: <aspider@pobox.com>, 206/689-6828,
<http://www.applespider.com>
Constants parsed from the egcs 1.1 header files Defines.h, Messages.h,
Errors.h, Base.h, & Sockets.h
This program is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License along
with this program (gpl.license.txt); if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
=head1 SEE ALSO
=cut