我有一个32位perl安装程序.使用它,我需要能够安装和卸载32位和64位应用程序。
安装32位和64位是可以的。卸载32位也可以.
但是,在卸载64位应用程序时,我遇到了问题.
应用程序只知道控制面板中Add Remove程序中的应用程序名称。例如,它可以是"Winzip 14.0“,这是Winzip的显示名称。
我使用以下方法卸载:我遍历HKLM/Software/Microsoft/Windows/CurrentVersion/Uninstall并解析当前的键,以查看Winzip是否匹配。如果是这样的话,我将从那里得到卸载字符串。
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,我不知道这是否会有帮助。即使如此,还有其他选择吗?
发布于 2010-01-21 19:21:00
是的,您必须使用KEY_WOW64_64KEY,32位进程没有其他解决办法.从Perl直接调用Win32 API似乎是可能的,从这个网页判断。
发布于 2010-03-23 00:05:57
您还可以直接调用reg工具,而不是批处理文件:
$WINDIR/system32/reg.exe这是操作系统中包含的reg.exe的默认位置。
$WINDIR/sysnative/reg.exe这是从32位进程执行本机64位reg.exe的虚拟位置。
发布于 2015-05-20 16:31:44
正如您在问题中所指出的,64KEY旗是可能的。
64KEY,但是现在更好的做法是使用TieRegistry的对象函数,它封装了功能,使使用注册表变得更容易:
#!/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位相关之前被问到)。
https://stackoverflow.com/questions/2110782
复制相似问题