信不信由你,我的安装程序太旧了,它没有选择检测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位重定向引起的).
要在命令框中检查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位版本)自动定义的环境变量.
下面是一些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;
我测试了我在问题中建议的解决方案:
经过Windows环境变量测试:ProgramW6432
如果它是非空的那么它是64位Windows.W
从批处理脚本:
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函数
请参阅如何检查计算机是否正在运行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位.
如果您可以进行API调用,请尝试使用GetProcAddress/GetModuleHandle来检查是否存在IsWow64Process,它仅存在于具有64位版本的Windows操作系统中.
您还可以尝试Vista/2008中使用的ProgramFiles(x86)环境变量以实现向后兼容,但我对XP-64或2003-64并不是100%肯定.
祝好运!
我在登录脚本中使用它来检测64位Windows
if"%ProgramW6432%"=="%ProgramFiles%"goto is64flag