Как определить битту ОС с помощью Perl в Windows?
Использование Perl, как я могу определить, работает ли моя программа на 32-битной Windows или 64-битной Windows?
Доступен ли какой-либо API?
Я могу представить несколько вариантов.
-
Проверьте PE_HEADER какого-либо файла Windows (например: c:\windows\explorer.exe
) - возможно, я смогу использовать данные в Как проверить DLL Windows, чтобы определить, 32bit или 64bit?
-
Проверьте существование c:\program files(x86)
- если он существует, то это 64-разрядная ОС. Иначе это 32-битная ОС Windows.
Есть ли хороший способ сделать это? Любой API, доступный в Perl?
Ответы
Ответ 1
Sys::Info выглядит многообещающим:
#!/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
Genuine Intel(R) CPU T2300 @ 1.66GHz (64 bit)
Windows XP Service Pack 3 build 2600 (32 bit)
Обратите внимание, что неправильно идентифицирует мой ноутбук как 64-битный (см. Процессор Intel® Core ™ Duo T2300 — отчет об ошибке).
Ответ 2
Возможно, вы можете просто проверить некоторые переменные среды:
См. HOWTO: обнаружение свидетельства процесса.
Ответ 3
Тестирование на наличие 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;
}
Ответ 4
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
здесь, как я использовал его в своем script (обратите внимание, что пример 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";
}
Ответ 5
Переменная PROCESSOR_ARCHITECTURE - "x86" в 32 бит.