信不信由你,我的安装程序太旧了,它没有选择检测64位版本的Windows .
是否有Windows DLL调用或(甚至更好)一个环境变量,可以为Windows XP和Windows Vista提供该信息?
One possible solution
我看到维基百科声称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-on-Windows 64位重定向引起的) .
22 回答
在C#中:
在VB.NET:
我用这个:
它适用于Windows XP,在Windows XP Professional上测试它64位和32位 .
请参阅How To Check If Computer Is Running A 32 Bit or 64 Bit Operating System中列出的批处理脚本 . 它还包括从注册表中检查此内容的说明:
您可以使用以下注册表位置来检查计算机是否运行32位或64位Windows操作系统:
您将在右侧窗格中看到以下注册表项:
上面的“x86”和“0x00000020(32)”表示操作系统版本是32位 .
要在命令框中检查64位版本的Windows,请使用以下模板:
test.bat的:
ProgramFiles(x86)
是仅在Windows 64位计算机上由cmd.exe(32位和64位版本)自动定义的环境变量 .下面是一些Delphi代码,用于检查您的程序是否在64位操作系统上运行:
我测试了我在问题中建议的解决方案:
经过Windows环境变量测试:ProgramW6432
如果它是非空的那么它是64位Windows.W
从批处理脚本:
使用Windows API:
资料来源:
HOWTO: Detect Process Bitness
GetSystemWow64Directory function
如果您可以进行API调用,请尝试使用GetProcAddress / GetModuleHandle来检查是否存在IsWow64Process,它仅存在于具有64位版本的Windows操作系统中 .
您也可以尝试使用Vista / 2008中使用的 ProgramFiles(x86) 环境变量来实现向后兼容,但我对XP-64或2003-64并不是100%肯定 .
祝好运!
我在登录脚本中使用它来检测64位Windows
if“%ProgramW6432%”==“%ProgramFiles%”goto is64flag
对于检索操作系统或硬件的实际位数(32或64)的VBScript / WMI单行,请查看http://csi-windows.com/toolkit/csi-getosbits
我没有't know what language you'重新使用,但如果操作系统是64位,则.NET具有环境变量
PROCESSOR_ARCHITEW6432
.如果您只想知道应用程序是运行32位还是64位,则可以检查
IntPtr.Size
. 如果在32位模式下运行,则为4;如果在64位模式下运行,则为8 .我想在这里添加我在shell脚本中使用的内容(但可以很容易地在任何语言中使用) . 原因是,这里的一些解决方案不能用于WoW64,有些使用的东西并不是真正意义上的(检查是否有*(x86)文件夹)或者在cmd脚本中不起作用 . 我觉得,这是“正确”的方式,即使在未来的Windows版本中也应该是安全的 .
很多答案都提到了调用
IsWoW64Process()
或相关函数 . 这不是正确的方法 . 您应该使用为此目的而设计的GetNativeSystemInfo()
. 这是一个例子:另见:https://msdn.microsoft.com/en-us/library/windows/desktop/ms724340%28v=vs.85%29.aspx
我不知道它存在哪个Windows版本,但在Windows Vista及更高版本上运行:
我知道这很古老但是,这就是我用来检测Win764的东西
我在Windows 7 x64 / x86和Windows XP x86上测试了以下批处理文件,这很好,但我还没有尝试过Windows XP x64,但这可能会起作用:
使用Windows Powershell,如果以下表达式返回true,那么它是64位操作系统:
(([Array](Get-WmiObject -Class Win32_Processor | Select-Object AddressWidth))[0].AddressWidth -eq 64)
这是从以下方面获取和修改的:http://depsharee.blogspot.com/2011/06/how-do-detect-operating-system.html(方法#3) . 我已经在Win7 64位(在32位和64位PowerShell会话中)和XP 32位测试了这个 .
最好的方法肯定是检查是否有两个程序文件目录,'Program Files'和'Program Files(x86)'这个方法的优点是你可以在o / s没有运行时这样做,例如如果机器无法启动和您希望重新安装操作系统
有趣的是,如果我使用
我在32位和64位ISE(Win7 64位)上都获得了AMD64 .
使用已编译可执行文件的PE编号的另一种方式created by eGerman(不依赖于注册表记录或环境变量):
这是批处理脚本的一种更简单的方法
检查注册表是否存在HKLM \ SOFTWARE \ Wow6432Node - 如果存在,则系统为64位 - 32位,否则为 .