home *** CD-ROM | disk | FTP | other *** search
- package Win32::Registry;
- #######################################################################
- #Perl Module for Registry Extensions
- # This module creates an object oriented interface to the Win32
- # Registry.
- #
- # NOTE: This package exports the following "key" objects to
- # the main:: name space.
- #
- # $main::HKEY_CLASSES_ROOT
- # $main::HKEY_CURRENT_USER
- # $main::HKEY_LOCAL_MACHINE
- # $main::HKEY_USERS
- # $main::HKEY_PERFORMANCE_DATA
- # $main::HKEY_CURRENT_CONFIG
- # $main::HKEY_DYN_DATA
- #
- #######################################################################
-
- require Exporter;
- require DynaLoader;
- use Win32::WinError;
-
- $VERSION = '0.062';
-
- @ISA= qw( Exporter DynaLoader );
- @EXPORT = qw(
- HKEY_CLASSES_ROOT
- HKEY_CURRENT_USER
- HKEY_LOCAL_MACHINE
- HKEY_PERFORMANCE_DATA
- HKEY_CURRENT_CONFIG
- HKEY_DYN_DATA
- HKEY_USERS
- KEY_ALL_ACCESS
- KEY_CREATE_LINK
- KEY_CREATE_SUB_KEY
- KEY_ENUMERATE_SUB_KEYS
- KEY_EXECUTE
- KEY_NOTIFY
- KEY_QUERY_VALUE
- KEY_READ
- KEY_SET_VALUE
- KEY_WRITE
- REG_BINARY
- REG_CREATED_NEW_KEY
- REG_DWORD
- REG_DWORD_BIG_ENDIAN
- REG_DWORD_LITTLE_ENDIAN
- REG_EXPAND_SZ
- REG_FULL_RESOURCE_DESCRIPTOR
- REG_LEGAL_CHANGE_FILTER
- REG_LEGAL_OPTION
- REG_LINK
- REG_MULTI_SZ
- REG_NONE
- REG_NOTIFY_CHANGE_ATTRIBUTES
- REG_NOTIFY_CHANGE_LAST_SET
- REG_NOTIFY_CHANGE_NAME
- REG_NOTIFY_CHANGE_SECURITY
- REG_OPENED_EXISTING_KEY
- REG_OPTION_BACKUP_RESTORE
- REG_OPTION_CREATE_LINK
- REG_OPTION_NON_VOLATILE
- REG_OPTION_RESERVED
- REG_OPTION_VOLATILE
- REG_REFRESH_HIVE
- REG_RESOURCE_LIST
- REG_RESOURCE_REQUIREMENTS_LIST
- REG_SZ
- REG_WHOLE_HIVE_VOLATILE
- );
-
- @EXPORT_OK = qw(
- RegCloseKey
- RegConnectRegistry
- RegCreateKey
- RegCreateKeyEx
- RegDeleteKey
- RegDeleteValue
- RegEnumKey
- RegEnumValue
- RegFlushKey
- RegGetKeySecurity
- RegLoadKey
- RegNotifyChangeKeyValue
- RegOpenKey
- RegOpenKeyEx
- RegQueryInfoKey
- RegQueryValue
- RegQueryValueEx
- RegReplaceKey
- RegRestoreKey
- RegSaveKey
- RegSetKeySecurity
- RegSetValue
- RegSetValueEx
- RegUnLoadKey
- );
- $EXPORT_TAGS{ALL}= \@EXPORT_OK;
-
- bootstrap Win32::Registry;
-
- sub import
- {
- my( $pkg )= shift;
- if ( $_[0] && "Win32" eq $_[0] ) {
- Exporter::export( $pkg, "Win32", @EXPORT_OK );
- shift;
- }
- Win32::Registry->export_to_level( 1+$Exporter::ExportLevel, $pkg, @_ );
- }
-
- #######################################################################
- # 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) {
- if ($! =~ /Invalid/) {
- $AutoLoader::AUTOLOAD = $AUTOLOAD;
- goto &AutoLoader::AUTOLOAD;
- }
- else {
- ($pack,$file,$line) = caller;
- die "Your vendor has not defined Win32::Registry macro $constname, used at $file line $line.";
- }
- }
- eval "sub $AUTOLOAD { $val }";
- goto &$AUTOLOAD;
- }
-
- #######################################################################
- # _new is a private constructor, not intended for public use.
- #
-
- sub _new
- {
- my $self;
- if ($_[0]) {
- $self->{'handle'} = $_[0];
- bless $self;
- }
- $self;
- }
-
- #define the basic registry objects to be exported.
- #these had to be hardwired unfortunately.
- # XXX Yuck!
-
- $main::HKEY_CLASSES_ROOT = _new(&HKEY_CLASSES_ROOT);
- $main::HKEY_CURRENT_USER = _new(&HKEY_CURRENT_USER);
- $main::HKEY_LOCAL_MACHINE = _new(&HKEY_LOCAL_MACHINE);
- $main::HKEY_USERS = _new(&HKEY_USERS);
- $main::HKEY_PERFORMANCE_DATA = _new(&HKEY_PERFORMANCE_DATA);
- $main::HKEY_CURRENT_CONFIG = _new(&HKEY_CURRENT_CONFIG);
- $main::HKEY_DYN_DATA = _new(&HKEY_DYN_DATA);
-
-
- #######################################################################
- #Open
- # creates a new Registry object from an existing one.
- # usage: $RegObj->Open( "SubKey",$SubKeyObj );
- # $SubKeyObj->Open( "SubberKey", *SubberKeyObj );
-
- sub Open
- {
- my $self = shift;
- die 'usage: Open( $SubKey, $ObjRef )' if @_ != 2;
-
- my ($subkey) = @_;
- my ($result,$subhandle);
-
- $result = RegOpenKey($self->{'handle'},$subkey,$subhandle);
- $_[1] = _new( $subhandle );
-
- return 0 unless $_[1];
- $! = Win32::GetLastError() unless $result;
- return $result;
- }
-
- #######################################################################
- #Close
- # close an open registry key.
- #
- sub Close
- {
- my $self = shift;
- die "usage: Close()" if @_ != 0;
-
- my $result = RegCloseKey($self->{'handle'});
- if ($result) {
- delete $self->{'handle'};
- }
- else {
- $! = Win32::GetLastError();
- }
- return $result;
- }
-
- sub DESTROY {
- my $self = shift;
- return unless exists $self->{'handle'};
- RegCloseKey($self->{'handle'});
- }
-
- #######################################################################
- #Connect
- # connects to a remote Registry object, returning it in $ObjRef.
- # returns false if it fails.
- # usage: $RegObj->Connect( $NodeName, $ObjRef );
-
- sub Connect
- {
- my $self = shift;
- die 'usage: Connect( $NodeName, $ObjRef )' if @_ != 2;
-
- my ($node) = @_;
- my ($result,$subhandle);
-
- $result = RegConnectRegistry ($node, $self->{'handle'}, $subhandle);
- $_[1] = _new( $subhandle );
-
- return 0 unless $_[1];
- $! = Win32::GetLastError() unless $result;
- return $result;
- }
-
- #######################################################################
- #Create
- # open a subkey. If it doesn't exist, create it.
- #
-
- sub Create
- {
- my $self = shift;
- die 'usage: Create( $SubKey,$ScalarRef )' if @_ != 2;
-
- my ($subkey) = @_;
- my ($result,$subhandle);
-
- $result = RegCreateKey($self->{'handle'},$subkey,$subhandle);
- $_[1] = _new ( $subhandle );
-
- return 0 unless $_[1];
- $! = Win32::GetLastError() unless $result;
- return $result;
- }
-
- #######################################################################
- #SetValue
- # SetValue sets a value in the current key.
- #
-
- sub SetValue
- {
- my $self = shift;
- die 'usage: SetValue($SubKey,$Type,$value )' if @_ != 3;
- my $result = RegSetValue( $self->{'handle'}, @_);
- $! = Win32::GetLastError() unless $result;
- return $result;
- }
-
- sub SetValueEx
- {
- my $self = shift;
- die 'usage: SetValueEx( $SubKey,$Reserved,$type,$value )' if @_ != 4;
- my $result = RegSetValueEx( $self->{'handle'}, @_);
- $! = Win32::GetLastError() unless $result;
- return $result;
- }
-
- #######################################################################
- #QueryValue and QueryKey
- # QueryValue gets information on a value in the current key.
- # QueryKey " " " " key " " "
-
- sub QueryValue
- {
- my $self = shift;
- die 'usage: QueryValue( $SubKey,$valueref )' if @_ != 2;
- my $result = RegQueryValue( $self->{'handle'}, @_);
- $! = Win32::GetLastError() unless $result;
- return $result;
- }
-
- sub QueryKey
- {
- my $garbage;
- my $self = shift;
- die 'usage: QueryKey( $classref, $numberofSubkeys, $numberofVals )'
- if @_ != 3;
-
- my $result = RegQueryInfoKey($self->{'handle'}, $_[0],
- $garbage, $garbage, $_[1],
- $garbage, $garbage, $_[2],
- $garbage, $garbage, $garbage, $garbage);
-
- $! = Win32::GetLastError() unless $result;
- return $result;
- }
-
- #######################################################################
- #QueryValueEx
- # QueryValueEx gets information on a value in the current key.
-
- sub QueryValueEx
- {
- my $self = shift;
- die 'usage: QueryValueEx( $SubKey,$type,$valueref )' if @_ != 3;
- my $result = RegQueryValueEx( $self->{'handle'}, $_[0], NULL, $_[1], $_[2] );
- $! = Win32::GetLastError() unless $result;
- return $result;
- }
-
- #######################################################################
- #GetKeys
- #Note: the list object must be passed by reference:
- # $myobj->GetKeys( \@mylist )
- sub GetKeys
- {
- my $self = shift;
- die 'usage: GetKeys( $arrayref )' if @_ != 1 or ref($_[0]) ne 'ARRAY';
-
- my ($result, $i, $keyname);
- $keyname = "DummyVal";
- $i = 0;
- $result = 1;
-
- while ( $result ) {
- $result = RegEnumKey( $self->{'handle'},$i++, $keyname );
- if ($result) {
- push( @{$_[0]}, $keyname );
- }
- }
- return(1);
- }
-
- #######################################################################
- #GetValues
- # GetValues creates a hash containing 'name'=> ( name,type,data )
- # for each value in the current key.
-
- sub GetValues
- {
- my $self = shift;
- die 'usage: GetValues( $hashref )' if @_ != 1;
-
- my ($result,$name,$type,$data,$i);
- $name = "DummyVal";
- $i = 0;
- while ( $result=RegEnumValue( $self->{'handle'},
- $i++,
- $name,
- NULL,
- $type,
- $data ))
- {
- $_[0]->{$name} = [ $name, $type, $data ];
- }
- return(1);
- }
-
- #######################################################################
- #DeleteKey
- # delete a key from the registry.
- # eg: $CLASSES_ROOT->DeleteKey( "KeyNameToDelete");
- #
-
- sub DeleteKey
- {
- my $self = shift;
- die 'usage: DeleteKey( $SubKey )' if @_ != 1;
- my $result = RegDeleteKey($self->{'handle'}, @_);
- $! = Win32::GetLastError() unless $result;
- return $result;
- }
-
- #######################################################################
- #DeleteValue
- # delete a value from the current key in the registry
- # $CLASSES_ROOT->DeleteValue( "\000" );
-
- sub DeleteValue
- {
- my $self = shift;
- die 'usage: DeleteValue( $SubKey )' if @_ != 1;
- my $result = RegDeleteValue($self->{'handle'}, @_);
- $! = Win32::GetLastError() unless $result;
- return $result;
- }
-
- #######################################################################
- #save
- #saves the current hive to a file.
- #
-
- sub Save
- {
- my $self = shift;
- die 'usage: Save( $FileName )' if @_ != 1;
- my $result = RegSaveKey($self->{'handle'}, @_);
- $! = Win32::GetLastError() unless $result;
- return $result;
- }
-
- #######################################################################
- #Load
- #loads a saved key from a file.
-
- sub Load
- {
- my $self = shift;
- die 'usage: Load( $SubKey,$FileName )' if @_ != 2;
- my $result = RegLoadKey($self->{'handle'}, @_);
- $! = Win32::GetLastError() unless $result;
- return $result;
- }
-
- #######################################################################
- #UnLoad
- #unloads a registry hive
-
- sub UnLoad
- {
- my $self = shift;
- die 'usage: UnLoad( $SubKey )' if @_ != 1;
- my $result = RegUnLoadKey($self->{'handle'}, @_);
- $! = Win32::GetLastError() unless $result;
- return $result;
- }
- #######################################################################
-
- 1;
- __END__
-