为什么Win32 :: TieRegistry不能列出子键?

时间:2009-03-24 15:46:27

标签: perl winapi registry tie

使用Cygwin Perl v5.8.8和Win32 :: TieRegistry 0.26。

我们可以为HKEY_CURRENT_USER获取绑定的哈希对象:

$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER"};
print Dumper $Key;'
$VAR1 = bless( {}, 'Win32::TieRegistry' );

这适用于子键:

$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper $Key;'
$VAR1 = bless( {}, 'Win32::TieRegistry' );

我们可以打印关键信息:

$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper $Key->Information;'
$VAR1 = 'CntSubKeys';
$VAR2 = 48;
$VAR3 = 'MaxSubClassLen';
$VAR4 = 21;
...

然而,文档暗示我们可以简单地将子键列为哈希值来列出子键:

$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper keys %$Key; '

但是数组是空的。它坏了还是我做错了什么?是否有另一种列出子键的方法?

这也不起作用:

$ perl -e '
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper $Key->SubKeyNames;'
Can't use an undefined value as an ARRAY reference at
/usr/lib/perl5/vendor_perl/5.8/cygwin/Win32/TieRegistry.pm line 720.

1 个答案:

答案 0 :(得分:2)

使用您的代码:

my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CURRENT_USER\\Software"};
print Dumper keys %$Key;

我在我的机器上得到了这个结果(WinXP,ActiveState Perl v5.10.0,Win32-TieRegistry 0.25):

$VAR1 = 'Adobe\\';
...
$VAR101 = 'Classes\\';
$VAR102 = '\\';

这就是我的第二个代码示例:

$VAR1 = 'Adobe';
...
$VAR101 = 'Classes';

因此,至少在ActiveState Perl和Windows XP上,两个代码示例都可以正常工作。

编辑:这看起来像一个更普遍的问题/错误: