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

8

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


2
"compiuter"? "abaout"? "programory"? 请在发布问题之前仔细阅读您的问题。 - Joachim Sauer
6
@Joachim Sauer:StackOverflow 是一个国际论坛,你不能期望每个人都用完美的英语表达 - 只需要修复烦人的语法错误即可。 - kludg
2
@Serg:不完美的英语和简单的错别字是两回事。我相信“abaout”是后者。我对不完美的英语没有任何问题(我自己也不是母语为英语的人)。 - Joachim Sauer
请参考以下问题:https://dev59.com/3UnSa4cB1Zd3GeqPNWP- - PhiS
8个回答

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;

7

您需要使用 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 pre 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 的线程都会调用该函数,将相同的结果写入相同的内存位置,仅在之后设置 WasCalledTrue

如果程序需要多次知道答案,缓存结果是个好主意。也就是说,你不想在循环中调用它,因为LoadLibrary会很昂贵,特别是当它找不到任何东西时。我并不是在否定这个解决方案,只是给出使用情况的建议。 - Chris Thornton
2
只有在项目设置中启用可分配/可写常量,此代码才能编译。为避免对此编译器设置敏感,可以引入指令以确保在此代码周围设置(和还原)所需的编译器行为,或者更好的方法是,建议使用一个单元变量来缓存结果(使用整数避免需要使用两个这样的变量:例如,声明initialized = -1表示“未设置”,set = 0表示Win32,set = 1表示Win64)。 - Deltics

3
如果a)你正在使用Windows,b)你可以访问注册表,那么HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion应该是有用的。

抱歉,但没有注册表。我正在使用Windows。 - gedO
5
@gedO:你自相矛盾了。Windows 意味着注册表。尝试从开始菜单运行“regedit”。 - Brian

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

2
TOSVersion是在XE2中引入的,问题是关于Delphi 2007的。 - bummi
@bummi实际上问题并没有指定Delphi的版本。它以前可能有过,但现在没有了。因此,这个答案是有效的 :) - Shaun Roselt

1

for 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;

1
此外,除了使用IsWow64Process函数外,GetNativeSystemInfo API函数(定义在Windows单元中)也可能引起您的兴趣,以了解更多有关当前CPU的信息(或者您可以使用汇编和CPUID)。

0

//没有测试过,但你可以试试这个

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

这个问题被标记为 delphi,并没有提到 .net 或 Java。因此,您不能假设 Environment 可用。请在回答问题之前阅读标签,确保您的答案适用于它们。如果您不确定,您可能不应该回答这个问题。 :-) - Ken White
一个Delphi程序员会注意到它必须有一个定义的对象环境,因此他只需将其删除: is64:=({Environment.}GetEnvironmentVariable('ProgramW6432')<>'');谢谢! - Edson Martins

0
我不知道如何在 Delphi 中调用 Win32 函数。
但是如果您编写一个 32 位程序,可以调用 Win32 API IsWow64Process 来知道您是否在 64 位操作系统中。
当然,如果您编写了一个 64 位 exe,它只会运行在 64 位 Windows 上,所以没有必要询问。

祝你用Delphi编写64位exe好运。 ;) - Deltics
1
刚刚在做。 (2015) - penarthur66

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接