Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Detect whether current Windows version is 32 bit or 64 bit

Believe it or not, my installer is so old that it doesn't have an option to detect the 64-bit version of Windows.

Is there a Windows DLL call or (even better) an environment variable that would give that information for Windows XP and Windows Vista?

One possible solution

I see that Wikipedia states that the 64-bit version of Windows XP and Windows Vista have a unique environment variable: %ProgramW6432%, so I'm guessing that'd be empty on 32-bit Windows.

This variable points to Program Files directory, which stores all the installed program of Windows and others. The default on English-language systems is C:\Program Files. In 64-bit editions of Windows (XP, 2003, Vista), there are also %ProgramFiles(x86)% which defaults to C:\Program Files (x86) and %ProgramW6432% which defaults to C:\Program Files. The %ProgramFiles% itself depends on whether the process requesting the environment variable is itself 32-bit or 64-bit (this is caused by Windows-on-Windows 64-bit redirection).

like image 791
Clay Nichols Avatar asked Mar 02 '09 02:03

Clay Nichols


2 Answers

To check for a 64-bit version of Windows in a command box, I use the following template:

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) is an environment variable automatically defined by cmd.exe (both 32-bit and 64-bit versions) on Windows 64-bit machines only.

like image 144
Dror Harari Avatar answered Sep 29 '22 12:09

Dror Harari


Here is some Delphi code to check whether your program is running on a 64 bit operating system:

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; 
like image 38
Blorgbeard Avatar answered Sep 29 '22 12:09

Blorgbeard