免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1699 | 回复: 0
打印 上一主题 下一主题

[已解决]perl 如何查询注册表某个键的内容 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-10 10:30 |只看该作者 |倒序浏览
写了一个perl查询注册表的例子,总是报错,请各位大侠赐教:
环境:win xp sp2   perl version: This is perl, v5.10.0 built for MSWin32-x86-multi-thread

#!C:\Perl\lib

use Win32::Registry;

$ORACLE_HOME=_queryreg("SOFTWARE\\ORACLE\\KEY_OraDb10g_home1","ORACLE_HOME");

print ("Info  checkVarAndLang,ORACLE_HOME=".$ORACLE_HOME);

$ORACLE_SID=_queryreg("SOFTWARE\\ORACLE\\KEY_OraDb10g_home1","ORACLE_SID");

print ("Info  checkVarAndLang,ORACLE_SID=".$ORACLE_SID);

$NLS_LANG=_queryreg("SOFTWARE\\ORACLE\\KEY_OraDb10g_home1","NLS_LANG");

print ("Info  checkVarAndLang, DB Client:NLS_LANG=".$NLS_LANG);

$ORACLE_BASE=_queryreg("SOFTWARE\\ORACLE\\KEY_OraDb10g_home1","ORACLE_BASE");

print ("Info  checkVarAndLang,ORACLE_BASE=".$ENV{ORACLE_BASE});

sub _queryreg($$)
{
        my ($Register)=shift;
        my ($subkey)=shift;
       
        print $Register."\n";
        print $subkey."\n";
       
        my $hkey,$value;
       
        $HKEY_LOCAL_MACHINE->Open($Register,$hkey)|| die $!;
        $hkey->QueryValueEx($subkey,NULL,$value);
        print "the $subkey value is : ";
        if ($value eq '')
        {
                print "undefined\n";
        }
        else
        {
                print "$value\n";
        }
        $hkey->Close();
        return $value;
}

报错:

C:\>perl testRegister.pl
SOFTWARE\ORACLE\KEY_OraDb10g_home1
ORACLE_HOME
Modification of a read-only value attempted at C:\Perl\lib/Win32/Registry.pm line 401.

Registry.pm line 401

sub QueryValueEx {
    my $self = shift;
    die 'usage: $obj->QueryValueEx($value_name, $type, $value)' if @_ != 3;
    my $result = RegQueryValueEx($self->{'handle'}, $_[0], undef, $_[1], $_[2]);     # line 401
    $! = Win32::GetLastError() unless $result;
    return $result;
}

各位大侠,看看那里有问题?


今天仔细看了Win32::Registry的脚本,忽然想到了解决方法:
下面是已经修改正确的代码:

#!C:\Perl\lib

#use Win32::Registry;
use POSIX;
use Sys::Hostname;

#判断操作系统
($sysname)=uname();
#print $sysname;

if($sysname=~/^\s*windows\s*/i)
{
        eval "use Win32API::File qw(:ALL);";
        eval "use Win32::Registry;";
}

$ORACLE_HOME=_queryreg("SOFTWARE\\ORACLE\\KEY_OraDb10g_home1","ORACLE_HOME");
print ("Info  checkVarAndLang,ORACLE_HOME=".$ORACLE_HOME."\n");

$ORACLE_SID=_queryreg("SOFTWARE\\ORACLE\\KEY_OraDb10g_home1","ORACLE_SID");
print ("Info  checkVarAndLang,ORACLE_SID=".$ORACLE_SID."\n");

$NLS_LANG=_queryreg("SOFTWARE\\ORACLE\\KEY_OraDb10g_home1","NLS_LANG");
print ("Info  checkVarAndLang, DB Client:NLS_LANG=".$NLS_LANG."\n");

$ORACLE_BASE=_queryreg("SOFTWARE\\ORACLE\\KEY_OraDb10g_home1","ORACLE_BASE");
print ("Info  checkVarAndLang,ORACLE_BASE=".$ORACLE_BASE."\n");

sub _queryreg()
{
        my ($Register,$subkey)=@_;
       
        #print $Register."\n";
        #print $subkey."\n";
       
        my $hkey;
        $HKEY_LOCAL_MACHINE->Open($Register, $hkey) or die "Can't open tips: $^E";
       
        my ($type, $value);
        $hkey->QueryValueEx($subkey, $type, $value) or die "No tip #$subkey: $^E";
       
        print "the $subkey value is : ";
        if ($value eq '')
        {
                print "undefined\n";
        }
        else
        {
                print "$value\n";
        }
        $hkey->Close();
        return $value;
}

[ 本帖最后由 tnarp 于 2009-6-12 11:40 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP