Using Perl, how can I determine whether my program is running on 32 bit Windows or 64 bit Windows?
Is there any API available?
I can think of a couple of options..
Check the PE_HEADER of some windows file (eg:
c:\windows\explorer.exe
) - maybe I can use the details in How can I test a windows dll to determine if it is 32bit or 64bit?Check for the existence of
c开发者_Go百科:\program files(x86)
- if it exists then it is a 64 bit OS. Else it is a 32 bit windows OS.
Is there any good way of doing this? Any API available in Perl?
Sys::Info looks promising:
#!/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;
Output:
C:\Temp> t Genuine Intel(R) CPU T2300 @ 1.66GHz (64 bit) Windows XP Service Pack 3 build 2600 (32 bit)
Note that it incorrectly identifies my laptop's CPU as being 64 bit (see Intel® Core™ Duo Processor T2300—bug report filed).
Perhaps you can just check some environment variables:
See HOWTO: Detect Process Bitness.
Testing for the existence of HKEY_LOCAL_MACHINE\Software\Wow6432Node is the most reliable method
#!/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;
}
Here is another easy method, checking Environment Variables
sub bitter {
my $bit;
my $OSbit = `set`;
if ($OSbit =~ m/Files\(x86\)/i) {
$bit = "64";
}
else {
$bit = "32";
}
return $bit;
}
MSDN recommends this logic (jeezus, why does this have to be so complicated?) 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
here's how I used it in my script (note that the MSDN example messes up the capitalization of the variable values, at least on Win7, so I do a case insensitive compare)
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";
}
The PROCESSOR_ARCHITECTURE variable is "x86" in 32bits
精彩评论