使用Perl,如何确定我的程序是在32位Windows还是64位Windows上运行?
有没有可用的API?
我可以想到几个选择..
检查一些Windows文件的PE_HEADER(例如: c:\windows\explorer.exe
) - 也许我可以使用细节 如何测试windows dll以确定它是32位还是64位?
检查是否存在 c:\program files(x86)
- 如果它存在则那么它是64位操作系统。否则它是一个32位Windows操作系统。
这样做有什么好办法吗? Perl中有哪些API?
SYS ::信息 看起来有前途
#!/usr/bin/perl
use strict; use warnings;
use Sys::Info;
my $info = Sys::Info->new;
my $cpu = $info->device('CPU');
printf "%s (%s bit)\n", scalar $cpu->identify, $cpu->bitness;
my $os = $info->os;
printf "%s (%s bit)\n", $os->name(long => 1), $os->bitness;
输出:
C:\ Temp> t
正版英特尔(R)CPU T2300 @ 1.66GHz(64位)
Windows XP Service Pack 3内置2600(32位)
请注意它 不正确 将我的笔记本电脑的CPU识别为64位(参见 英特尔酷睿双核处理器T2300-bug报告提交)。
测试是否存在HKEY_LOCAL_MACHINE \ Software \ Wow6432Node是最可靠的方法
#!/usr/bin/perl
use strict;
use Win32::Registry;
my $bitReturn = &bitter();
print "OS Bit: $bitReturn \n";
# Testing for the existence of HKEY_LOCAL_MACHINE\Software\Wow6432Node is the most reliable method
sub bitter {
my $Register = "Software\\Wow6432Node";
my ($hkey,$bitReturn);
if ($HKEY_LOCAL_MACHINE->Open($Register,$hkey)) {
$bitReturn = "64";
}
else {
$bitReturn = "32"
}
return $bitReturn;
}
这是另一个简单的方法,检查环境变量
sub bitter {
my $bit;
my $OSbit = `set`;
if ($OSbit =~ m/Files\(x86\)/i) {
$bit = "64";
}
else {
$bit = "32";
}
return $bit;
}
MSDN推荐这种逻辑(jeezus,为什么这必须如此复杂?)
http://blogs.msdn.com/b/david.wang/archive/2006/03/26/howto-detect-process-bitness.aspx
IF PROCESSOR_ARCHITECTURE == amd64 OR
PROCESSOR_ARCHITEW6432 == amd64 THEN
// OS is 64bit
ELSE
// OS is 32bit
END IF
这是我在我的脚本中使用它的方式(请注意,MSDN示例会混淆变量值的大写,至少在Win7上,所以我做了一个不区分大小写的比较)
if (uc($ENV{PROCESSOR_ARCHITECTURE}) eq "AMD64" ||
uc($ENV{PROCESSOR_ARCHITEW6432}) eq "AMD64") {
push @impactBinaries, "C:/Xilinx/13.1/LabTools/LabTools/bin/nt64/impact.exe";
} else {
push @impactBinaries, "C:/Xilinx/13.1/LabTools/LabTools/bin/nt/impact.exe";
}
PROCESSOR_ARCHITECTURE变量是32位的“x86”