Subject: | Win32::TieRegistry Problem |
Date: | Fri, 23 Feb 2007 14:22:06 -0400 |
To: | <bug-Win32-TieRegistry [...] rt.cpan.org> |
From: | "Bruce Dilke" <bruce [...] dilke.com> |
Hi,
I have been unable to get myself out of this one, thought I should get help
to see if it was a bug.
Win32::TieRegistry produces an error:
(using verions 0.24 and 0.25)
Can't use an undefined value as an ARRAY reference at
c:/Perl/site/lib/Win32/TieRegistry.pm line 678.
it does this while looping through a list of subkey names to get the values.
It will correctly process a varying number of the subkeys before crashing
,sometimes as many as 70, sometimes as few as 5.
Thanks for any Insight
Bruce
The shard of Code I am using (environment etc. at the end of email):
use Win32::AdminMisc;
use Win32::ODBC;
use Win32::TieRegistry;
$Machine = Win32::NodeName();
$keystring = "HKEY_LOCAL_MACHINE\\SOFTWARE\\ODBC\\ODBC.INI\\";
$key = new Win32::TieRegistry $keystring;
@subKeyNames = $key->SubKeyNames;
my $DsnCount = 0;
foreach my $DSNminor ( @subKeyNames )
{
my @attr=("","","","","","","","","","");
my $DSNName = $DSNminor;
my $ODBCUserName = "";
my $ODBCDriverVersion = "";
my $ODBCManagerVersion = "";
my $ODBCDriverName = "";
my $ODBCDatabase = "";
my $ODBCServer = "";
my $Result = "";
my $ErrorText = "";
my $AttrCount = 0;
my %Config = Win32::ODBC::GetDSN( $DSNminor );
foreach my $Attrib ( keys( %Config ) )
{
@attr[$AttrCount]= $Config{$Attrib};
$AttrCount++;
}
#
# Use the registry entries to determine characteristics of the DSN
#
$Result = "Unknown";
$ErrorText = "Unknown";
$ODBCDriverVersion = "Unknown";
$ODBCManagerVersion = "Unknown";
#
# Get Value Names for this registry Key
#
$key1="";
$key1= new Win32::TieRegistry "LMachine\\Software\\ODBC\\ODBC.INI\\",
{Access=>KEY_READ, Delimiter=>"\\"};
$subkey= $key1->Open($DSNminor." <file://\\> \\",{Access=>KEY_READ,
Delimiter=>"\\"});
print $key1." $DSNminor\n";
@valueNames = ("x","x","x","x","x","x");
@valueNames = $subkey->ValueNames;
$ODBCDriverName = $subkey->GetValue("Driver") if $valueNames[0] =
"Driver";
$ODBCUserName = $subkey->GetValue("LastUser") if $valueNames[3] =
"LastUser";
$ODBCServer = $subkey->GetValue("Server") if $valueNames[2] =
"Server";
$ODBCDatabase = $subkey->GetValue("Database") if $valueNames[5] =
"Database";
$DsnCount++;
}
environment:
D:\>perl -V
Summary of my perl5 (revision 5 version 8 subversion 8) configuration:
Platform:
osname=MSWin32, osvers=5.0, archname=MSWin32-x86-multi-thread
uname=''
config_args='undef'
hint=recommended, useposix=true, d_sigaction=undef
usethreads=define use5005threads=undef useithreads=define
usemultiplicity=define
useperlio=define d_sfio=undef uselargefiles=define usesocks=undef
use64bitint=undef use64bitall=undef uselongdouble=undef
usemymalloc=n, bincompat5005=undef
Compiler:
cc='cl', ccflags ='-nologo -GF -W3 -MD -Zi -DNDEBUG -O1 -DWIN32
-D_CONSOLE -DNO_STRICT -DHAVE_DES_FCRYPT -DNO_HASH_SEED -DUSE_SI
TECUSTOMIZE -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS -DUSE_PERLIO
-DPERL_MSVCRT_READFIX',
optimize='-MD -Zi -DNDEBUG -O1',
cppflags='-DWIN32'
ccversion='12.00.8804', gccversion='', gccosandvers=''
intsize=4, longsize=4, ptrsize=4, doublesize=8, byteorder=1234
d_longlong=undef, longlongsize=8, d_longdbl=define, longdblsize=10
ivtype='long', ivsize=4, nvtype='double', nvsize=8, Off_t='__int64',
lseeksize=8
alignbytes=8, prototype=define
Linker and Libraries:
ld='link', ldflags ='-nologo -nodefaultlib -debug -opt:ref,icf
-libpath:"C:\Perl\lib\CORE" -machine:x86'
libpth=\lib
libs= oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib
netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib version.lib odbc32.lib
odbccp32.lib msvcrt.lib
perllibs= oldnames.lib kernel32.lib user32.lib gdi32.lib winspool.lib
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32
.lib netapi32.lib uuid.lib ws2_32.lib mpr.lib winmm.lib version.lib
odbc32.lib odbccp32.lib msvcrt.lib
libc=msvcrt.lib, so=dll, useshrplib=yes, libperl=perl58.lib
gnulibc_version=''
Dynamic Linking:
dlsrc=dl_win32.xs, dlext=dll, d_dlsymun=undef, ccdlflags=' '
cccdlflags=' ', lddlflags='-dll -nologo -nodefaultlib -debug
-opt:ref,icf -libpath:"C:\Perl\lib\CORE" -machine:x86'
Characteristics of this binary (from libperl):
Compile-time options: MULTIPLICITY PERL_IMPLICIT_CONTEXT
PERL_IMPLICIT_SYS PERL_MALLOC_WRAP
PL_OP_SLAB_ALLOC USE_ITHREADS USE_LARGE_FILES
USE_PERLIO USE_SITECUSTOMIZE
Locally applied patches:
ActivePerl Build 819 [267479]
Iin_load_module moved for compatibility with build 806
PerlEx support in CGI::Carp
Less verbose ExtUtils::Install and Pod::Find
Patch for CAN-2005-0448 from Debian with modifications
Rearrange @INC so that 'site' is searched before 'perl'
Partly reverted 24733 to preserve binary compatibility
28671 Define PERL_NO_DEV_RANDOM on Windows
28376 Add error checks after execing PL_cshname or PL_sh_path
28305 Pod::Html should not convert "foo" into ``foo''
27736 Make perl_fini() run with Sun WorkShop compiler
27619 Bug in Term::ReadKey being triggered by a bug in
Term::ReadLine
27549 Move DynaLoader.o into libperl.so
27528 win32_pclose() error exit doesn't unlock mutex
27527 win32_async_check() can loop indefinitely
27515 ignore directories when searching @INC
27359 Fix -d:Foo=bar syntax
27210 Fix quote typo in c2ph
27203 Allow compiling swigged C++ code
27200 Make stat() on Windows handle trailing slashes correctly
27194 Get perl_fini() running on HP-UX again
27133 Initialise lastparen in the regexp structure
27034 Avoid "Prototype mismatch" warnings with autouse
26970 Make Passive mode the default for Net::FTP
26921 Avoid getprotobyname/number calls in IO::Socket::INET
26897,26903 Make common IPPROTO_* constants always available
26670 Make '-s' on the shebang line parse -foo=bar switches
26536 INSTALLSCRIPT versus INSTALLDIRS
26379 Fix alarm() for Windows 2003
26087 Storable 0.1 compatibility
25861 IO::File performace issue
25084 long groups entry could cause memory exhaustion
24699 ICMP_UNREACHABLE handling in Net::Ping
Built under MSWin32
Compiled at Aug 29 2006 12:42:41
%ENV:
PERL5LIB="C:\Program Files\ActiveState Perl Dev Kit 6.0\lib\"
PERLDB_OPTS="RemotePort=127.0.0.1:2000"
@INC:
C:\Program Files\ActiveState Perl Dev Kit 6.0\lib\
c:/Perl/site/lib
c:/Perl/lib
.
Message body is not shown because it is too large.