当前位置:  开发笔记 > 编程语言 > 正文

检测当前Windows版本是32位还是64位

如何解决《检测当前Windows版本是32位还是64位》经验,为你挑选了7个好方法。

信不信由你,我的安装程序太旧了,它没有选择检测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位(这是由Windows的上-Windows 64位重定向引起的).



1> Dror Harari..:

要在命令框中检查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) 是仅在Windows 64位计算机上由cmd.exe(32位和64位版本)自动定义的环境变量.


我喜欢它...简单,它完成了工作.
请注意,"if"的大括号在XP +中工作.如果你关心Win98那是;-).

2> Blorgbeard..:

下面是一些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;



3> Clay Nichols..:

我测试了我在问题中建议的解决方案:

经过Windows环境变量测试:ProgramW6432

如果它是非空的那么它是64位Windows.W


我的Vista 64上没有这些环境变量(ProgramW6432 PROCESSOR_ARCHITEW6432).我确实有PROCESSOR_ARCHITECTURE,设置为x86或AMD64
@Mike,@ total,@ Clay:我的64位Vista Enterprise SP2上有`ProgramW6432`,`PROCESSOR_ARCHITEW6432`和`CommonProgramW6432`,但只有32位命令提示符.是否定义这些变量似乎取决于调用进程的位数,而不是OS位数.
您在问题中列出的环境变量是ProgramW6432.在这里,您列出了PROCESSOR_ARCHITEW6432.你用的是哪一个?

4> Leif Gruenwo..:

从批处理脚本:

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

资料来源:

    HOWTO:检测过程位数

    GetSystemWow64Directory函数


请注意,我的64位Win7计算机的PROCESSOR_ARCHITECTURE设置为AMD64。

5> Leif Gruenwo..:

请参阅如何检查计算机是否正在运行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位.


我发现引用的知识库文章有点令人困惑:它们会查看CPU是32位还是64位,并从中确定您运行的是32位还是64位Windows?我很确定你可以在64位CPU上运行32位Windows.或者也许我错过了什么......
关于`HKEY_LOCAL_MACHINE\HARDWARE\DESCRIPTION\System\CentralProcessor\0` ... - 在Win7 64位框上,我有以下值:Identifier ="Intel64 Family 6 Model 23 Stepping 6",Platform ID = 1 - 在WinXP 32盒(VM)上,我有以下值:Identifier ="x86 Family 6 Model 26 Stepping 5",Platform ID = 1这里的点是***而不是***依赖于Platform ID (因为x86并不总是0x00000020).

6> Jason..:

如果您可以进行API调用,请尝试使用GetProcAddress/GetModuleHandle来检查是否存在IsWow64Process,它仅存在于具有64位版本的Windows操作系统中.

您还可以尝试Vista/2008中使用的ProgramFiles(x86)环境变量以实现向后兼容,但我对XP-64或2003-64并不是100%肯定.

祝好运!


根据MSDN的IsWow64Process文章,"请注意,这种技术不是检测操作系统是否是64位版本Windows的可靠方法,因为当前版本的32位Windows中的Kernel32.dll也包含此功能. "

7> 小智..:

我在登录脚本中使用它来检测64位Windows

if"%ProgramW6432%"=="%ProgramFiles%"goto is64flag

推荐阅读
sx-March23
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有