如何获取有关计算机的信息? [32位或64位]

时间:2010-03-26 14:27:28

标签: delphi 32bit-64bit delphi-2007

如何获取有关Windows操作系统类型的信息?是32位还是64位?我如何以编程方式获取此信息?

8 个答案:

答案 0 :(得分:12)

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;

答案 1 :(得分:6)

您需要使用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;

因为该功能仅适用于具有64位风格的Windows版本。将其声明为external会阻止您的应用程序在Windows 2000或Windows XP SP2之前运行。

修改

Chris出于性能原因发布了关于缓存结果的评论。对于这个特定的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安装上更改。从多个线程同时调用它是安全的,因为发现WasCalledFalse的两个线程都将调用该函数,将相同的结果写入相同的内存位置,然后才设置{{ 1}}到WasCalled

答案 2 :(得分:3)

如果a)你在windows上,b)你可以访问注册表,那么HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion应该是提供信息。

答案 3 :(得分:1)

除了IsWow64Process之外,GetNativeSystemInfo API函数可能对您感兴趣(它在Windows单元中定义),以了解有关您所使用的CPU的更多信息(或者你可以使用汇编和CPUID)。

答案 4 :(得分:0)

我不知道如何在Delphi中调用Win32函数。

但是如果你编写一个32位程序,你可以调用Win32 API IsWow64Process来知道你是否在64位操作系统中。

当然,如果你编写一个64位的exe,它只能在64位Windows上运行,所以没有必要问。

答案 5 :(得分:0)

//未经测试但你可以试试这个

is64 := (Environment.GetEnvironmentVariable('ProgramW6432') <> '');

答案 6 :(得分:0)

表示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;

答案 7 :(得分:0)

function TForm2.Arch: string;
begin
if TOSVersion.Architecture=arIntelX86 then
   Result := '32-bit' Else  Result := '64-bit'
end;