Определить, является ли текущая версия Windows 32-битной или 64-битной - PullRequest
61 голосов
/ 02 марта 2009

Верьте или нет, мой установщик настолько стар, что у него нет возможности определять 64-разрядную версию Windows.

Есть ли в Windows вызов DLL или (что еще лучше) переменная среды, которая выдала бы эту информацию для Windows XP и Windows Vista?

Одно из возможных решений

Я вижу, что Википедия утверждает, что 64-разрядная версия Windows XP и Windows Vista имеет уникальную переменную среды: %ProgramW6432%, поэтому я предполагаю, что она будет пустой в 32-разрядной Windows.

Эта переменная указывает на каталог Program Files, в котором хранятся все установленные программы Windows и другие. По умолчанию в англоязычных системах используется C:\Program Files. В 64-разрядных выпусках Windows (XP, 2003, Vista) также есть %ProgramFiles(x86)%, по умолчанию C:\Program Files (x86) и %ProgramW6432%, по умолчанию C:\Program Files. Сам %ProgramFiles% зависит от того, является ли процесс, запрашивающий переменную среды, самим 32-разрядным или 64-разрядным (это вызвано 64-разрядным перенаправлением Windows-on-Windows).

Ответы [ 22 ]

62 голосов
/ 02 декабря 2009

Чтобы проверить наличие 64-битной версии Windows в командной строке, я использую следующий шаблон:

test.bat:

@echo off
if defined ProgramFiles(x86) (
    @echo yes
    @echo Some 64-bit work
) else (
    @echo no
    @echo Some 32-bit work
)

ProgramFiles(x86) - это переменная среды, автоматически определяемая cmd.exe (32-разрядная и 64-разрядная версии) только на 64-разрядных компьютерах Windows.

20 голосов
/ 28 октября 2009

Вот некоторый код Delphi, чтобы проверить, работает ли ваша программа в 64-битной операционной системе:

function Is64BitOS: Boolean;
{$IFNDEF WIN64}
type
  TIsWow64Process = function(Handle:THandle; var IsWow64 : BOOL) : BOOL; stdcall;
var
  hKernel32 : Integer;
  IsWow64Process : TIsWow64Process;
  IsWow64 : BOOL;
{$ENDIF}
begin
  {$IFDEF WIN64}
     //We're a 64-bit application; obviously we're running on 64-bit Windows.
     Result := True;
  {$ELSE}
  // We can check if the operating system is 64-bit by checking whether
  // we are running under Wow64 (we are 32-bit code). We must check if this
  // function is implemented before we call it, because some older 32-bit 
  // versions of kernel32.dll (eg. Windows 2000) don't know about it.
  // See "IsWow64Process", http://msdn.microsoft.com/en-us/library/ms684139.aspx
  Result := False;
  hKernel32 := LoadLibrary('kernel32.dll');
  if hKernel32 = 0 then RaiseLastOSError;
  try
    @IsWow64Process := GetProcAddress(hkernel32, 'IsWow64Process');
    if Assigned(IsWow64Process) then begin
      if (IsWow64Process(GetCurrentProcess, IsWow64)) then begin
        Result := IsWow64;
      end
      else RaiseLastOSError;
    end;
  finally
    FreeLibrary(hKernel32);
  end;  
  {$ENDIf}
end;
13 голосов
/ 27 ноября 2011

Из пакетного скрипта:

IF PROCESSOR_ARCHITECTURE == x86 AND
   PROCESSOR_ARCHITEW6432 NOT DEFINED THEN
   // OS is 32bit
ELSE
   // OS is 64bit
END IF

Использование Windows API :

if (GetSystemWow64Directory(Directory, MaxDirectory) > 0) 
   // OS is 64bit
else
   // OS is 32bit

Источники:

  1. HOWTO: определить битность процесса
  2. Функция GetSystemWow64Directory
13 голосов
/ 17 марта 2009

Я протестировал решение, предложенное в моем вопросе:

Протестировано для переменной среды Windows: ProgramW6432

Если он не пустой, то это 64-битная Windows.W

9 голосов
/ 27 ноября 2011

См. Пакетный скрипт, указанный в Как проверить, работает ли компьютер в 32-битной или 64-битной операционной системе . В него также включены инструкции для проверки этого из Реестра:

Вы можете использовать следующее расположение реестра, чтобы проверить, работает ли компьютер под управлением 32- или 64-разрядной операционной системы Windows:

HKLM\HARDWARE\DESCRIPTION\System\CentralProcessor\0

В правой панели вы увидите следующие записи реестра:

Identifier     REG_SZ             x86 Family 6 Model 14 Stepping 12
Platform ID    REG_DWORD          0x00000020(32)

Вышеупомянутые «x86» и «0x00000020 (32)» указывают, что версия операционной системы является 32-разрядной.

8 голосов
/ 02 марта 2009

Если вы можете совершать вызовы API, попробуйте использовать GetProcAddress / GetModuleHandle , чтобы проверить наличие IsWow64Process , которое присутствует только в ОС Windows с 64 версии.

Вы также можете попробовать переменную окружения ProgramFiles (x86) , используемую в Vista / 2008 для обратной совместимости, но я не уверен на 100% в XP-64 или 2003-64.

Удачи!

6 голосов
/ 05 марта 2010

Я использовал это в сценарии входа в систему для обнаружения 64-битной Windows

если "% ProgramW6432%" == "% ProgramFiles%" перейти is64flag

4 голосов
/ 14 декабря 2010

Для однострочного VBScript / WMI, который извлекает фактическое число битов (32 или 64) ОС или аппаратного обеспечения, посмотрите http://csi -windows.com / toolkit / csi-getosbits

4 голосов
/ 02 марта 2009

Я не знаю, какой язык вы используете, но .NET имеет переменную среды PROCESSOR_ARCHITEW6432, если ОС 64-битная.

Если вам нужно знать, работает ли ваше приложение 32-разрядным или 64-разрядным, вы можете проверить IntPtr.Size. Это будет 4, если работает в 32-битном режиме и 8, если работает в 64-битном режиме.

3 голосов
/ 24 марта 2015

Во многих ответах упоминается вызов IsWoW64Process() или связанные с ним функции. Это не правильный способ. Вы должны использовать GetNativeSystemInfo(), который был разработан для этой цели. Вот пример:

SYSTEM_INFO info;
GetNativeSystemInfo(&info);

if (info.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64) {
  // It's a 64-bit OS
}

Также см .: https://msdn.microsoft.com/en-us/library/windows/desktop/ms724340%28v=vs.85%29.aspx

...