Как получить информацию о компьютере? [32 бита или 64 бита]

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

7
задан Piotr Dobrogost 21 April 2012 в 22:44
поделиться

5 ответов

Вам необходимо использовать 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 pre SP2.

Редактировать:

Крис опубликовал комментарий о кешировании результата по соображениям производительности. Это может быть необязательно для этой конкретной функции 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 .

7
ответ дан 6 December 2019 в 07:50
поделиться

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

3
ответ дан 6 December 2019 в 07:50
поделиться

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

1
ответ дан 6 December 2019 в 07:50
поделиться

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

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

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

0
ответ дан 6 December 2019 в 07:50
поделиться
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;
12
ответ дан 6 December 2019 в 07:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: