Как получить информацию о компьютере? [32-битный или 64-битный] - PullRequest
7 голосов
/ 26 марта 2010

Как я могу получить информацию о типе ОС Windows? Это 32-битная или 64-битная? Как я могу получить эту информацию программно?

Ответы [ 8 ]

12 голосов
/ 26 марта 2010
function IsWin64: Boolean;
var
  IsWow64Process : function(hProcess : THandle; var Wow64Process : BOOL): BOOL; stdcall;
  Wow64Process : BOOL;
begin
  Result := False;
  IsWow64Process := GetProcAddress(GetModuleHandle(Kernel32), 'IsWow64Process');
  if Assigned(IsWow64Process) then begin
    if IsWow64Process(GetCurrentProcess, Wow64Process) then begin
      Result := Wow64Process;
    end;
  end;
end;
6 голосов
/ 26 марта 2010

Вам необходимо использовать GetProcAddress() для проверки доступности функции IsWow64Process() во время выполнения, например:

function Is64BitWindows: boolean;
type
  TIsWow64Process = function(hProcess: THandle; var Wow64Process: BOOL): BOOL;
    stdcall;
var
  DLLHandle: THandle;
  pIsWow64Process: TIsWow64Process;
  IsWow64: BOOL;
begin
  Result := False;
  DllHandle := LoadLibrary('kernel32.dll');
  if DLLHandle <> 0 then begin
    pIsWow64Process := GetProcAddress(DLLHandle, 'IsWow64Process');
    Result := Assigned(pIsWow64Process)
      and pIsWow64Process(GetCurrentProcess, IsWow64) and IsWow64;
    FreeLibrary(DLLHandle);
  end;
end;

, потому что эта функция доступна только в версиях Windows, которые имеют 64-битную версию. Объявление его как external не позволит вашему приложению работать в Windows 2000 или Windows XP с пакетом обновления 2 (SP2).

Edit:

Крис опубликовал комментарий о кэшировании результата по соображениям производительности. Это может быть необязательным для данной конкретной функции API, потому что kernel32.dll всегда будет там (и я не могу представить программу, которая даже загружалась бы без нее), но для других функций все может быть иначе , Итак, вот версия, которая кэширует результат функции:

function Is64BitWindows: boolean;
type
  TIsWow64Process = function(hProcess: THandle; var Wow64Process: BOOL): BOOL;
    stdcall;
var
  DLLHandle: THandle;
  pIsWow64Process: TIsWow64Process;
const
  WasCalled: BOOL = False;
  IsWow64: BOOL = False;
begin
  if not WasCalled then begin
    DllHandle := LoadLibrary('kernel32.dll');
    if DLLHandle <> 0 then begin
      pIsWow64Process := GetProcAddress(DLLHandle, 'IsWow64Process');
      if Assigned(pIsWow64Process) then
        pIsWow64Process(GetCurrentProcess, IsWow64);
      WasCalled := True;
      FreeLibrary(DLLHandle);
    end;
  end;
  Result := IsWow64;
end;

Кэширование результата этой функции безопасно, поскольку функция API будет там или нет, и ее результат не может измениться при той же установке Windows. Даже безопасно вызывать это одновременно из нескольких потоков, так как два потока, которые находят WasCalled равным False, будут оба вызывать функцию, записывать один и тот же результат в одну и ту же ячейку памяти и только потом устанавливать WasCalled в True.

3 голосов
/ 26 марта 2010

Если а) вы находитесь в Windows и б) вы можете получить доступ к реестру, то HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion должно быть информативным.

1 голос
/ 26 марта 2010

В дополнение к IsWow64Process функция API GetNativeSystemInfo может представлять интерес для вас (она определена в модуле Windows), чтобы узнать больше о процессоре, на котором вы работаете (или вы можно использовать сборку и CPUID).

0 голосов
/ 16 ноября 2014
function TForm2.Arch: string;
begin
if TOSVersion.Architecture=arIntelX86 then
   Result := '32-bit' Else  Result := '64-bit'
end;
0 голосов
/ 21 апреля 2014

для delphi XE +

Uses System.SysUtils

Function IsWin64Or32: string;
Begin
   if Pos( '64-bit', TOSVersion.ToString ) > 0 then
     Result := '64-bit'
   Else
     Result := '32-bit';
End;

Пример

lbl1.Caption := IsWin64Or32;
0 голосов
/ 18 марта 2013

// не проверено, но вы можете попробовать это

is64 := (Environment.GetEnvironmentVariable('ProgramW6432') <> '');
0 голосов
/ 26 марта 2010

Я не знаю, как вызвать функцию Win32 в Delphi.

Но если вы пишете 32-битную программу, вы можете вызвать Win32 API IsWow64Process, чтобы узнать, работаете ли вы в 64-битной ОС.

Конечно, если вы напишите 64-битный exe-файл, он будет работать только на 64-битной Windows, поэтому нет необходимости спрашивать.

...