首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使32位Perl读取64位Windows注册表?

如何使32位Perl读取64位Windows注册表?
EN

Stack Overflow用户
提问于 2010-01-21 16:15:30
回答 3查看 4.8K关注 0票数 6

我有一个32位perl安装程序.使用它,我需要能够安装和卸载32位和64位应用程序。

安装32位和64位是可以的。卸载32位也可以.

但是,在卸载64位应用程序时,我遇到了问题.

应用程序只知道控制面板中Add Remove程序中的应用程序名称。例如,它可以是"Winzip 14.0“,这是Winzip的显示名称。

我使用以下方法卸载:我遍历HKLM/Software/Microsoft/Windows/CurrentVersion/Uninstall并解析当前的键,以查看Winzip是否匹配。如果是这样的话,我将从那里得到卸载字符串。

代码语言:javascript
复制
    my $register = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall";
    $HKEY_LOCAL_MACHINE->Open($register,$hKey)|| die $!;
    #Then parse all the nodes and fetch the uninstall string

如果应用程序是64位安装,那么卸载信息将驻留在HKLM/Software/Microsoft/Windows/CurrentVersion/Uninstall中。

然而,上面给出的perl安装程序代码正在尝试从HKLM/Software/WOW6432Node/Microsoft/Windows/CurrentVersion/Uninstall读取。

也找不到那里的装置。

那么,如何使Perl代码在32_bit进程中运行,以读取64位单元中的注册表值?我知道接受RegOpenKey()参数的KEY_WOW64_64KEY API。但是由于它是一个Windows,我不知道这是否会有帮助。即使如此,还有其他选择吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-01-21 19:21:00

是的,您必须使用KEY_WOW64_64KEY,32位进程没有其他解决办法.从Perl直接调用Win32 API似乎是可能的,从这个网页判断。

票数 2
EN

Stack Overflow用户

发布于 2010-03-23 00:05:57

您还可以直接调用reg工具,而不是批处理文件:

代码语言:javascript
复制
$WINDIR/system32/reg.exe

这是操作系统中包含的reg.exe的默认位置。

代码语言:javascript
复制
$WINDIR/sysnative/reg.exe

这是从32位进程执行本机64位reg.exe的虚拟位置。

票数 2
EN

Stack Overflow用户

发布于 2015-05-20 16:31:44

正如您在问题中所指出的,64KEY旗是可能的。

64KEY,但是现在更好的做法是使用TieRegistry的对象函数,它封装了功能,使使用注册表变得更容易:

代码语言:javascript
复制
#!/usr/bin/perl -w
use strict;
use Win32::TieRegistry (Delimiter => '/');

print "registry 64-bit:\n";
my $mykey = new Win32::TieRegistry
  'HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Uninstall',
  { Access=>Win32::TieRegistry::KEY_READ()|0x0100, Delimiter=>'/' };

print "\tValues are:\n";
print join("\n\t\t", $mykey->ValueNames);
print "\n";

#Getting a specific value's value
#$mykeyval = $mykey->GetValue('Path');

print "\tFiltered subkeys are:\n\t\t";
print join("\n\t\t", grep(!/\{[-A-Fa-f0-9]+\}/, $mykey->SubKeyNames));
print "\n";

print "registry 32-bit explicit:\n";
$mykey = new Win32::TieRegistry
  'HKEY_LOCAL_MACHINE/Software/Microsoft/Windows/CurrentVersion/Uninstall',
  { Access=>Win32::TieRegistry::KEY_READ()|0x0200, Delimiter=>'/' };

print "\tValues are:\n\t\t";
print join("\n\t\t", $mykey->ValueNames);
print "\n";

#Getting a specific value's value
#$mykeyval = $mykey->GetValue('Path');

print "\tFiltered subkeys are:\n\t\t";
print join("\n\t\t", grep(!/\{[-A-Fa-f0-9]+\}/, $mykey->SubKeyNames));
print "\n";

这给出了32位和64位键的预期结果,另外,在32位和64位Perl中也应该以相同的方式工作(理论上)。

注意:我需要在我的Perl版本中为KEY_READ()函数指定完整的命名空间,以防止编译错误,而且我不确定0x0100和0x0200常量是否有命名值,因此这可能更漂亮。但很管用!

(改编自https://stackoverflow.com/a/30308389/1390430,在我知道我的问题与64位和32位相关之前被问到)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2110782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档