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

Delphi 如何获取有关计算机的信息?[32位或64位],delphi,32bit-64bit,delphi-2007,Delphi,32bit 64bit,Delphi 2007,如何获取有关Windows操作系统类型的信息?是32位还是64位?如何通过编程获取此信息?如果a)您使用windows,b)您可以访问注册表,那么HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\windows NT\CurrentVersion应该提供信息。我不知道如何在Delphi中调用Win32函数 但是,如果您编写32位程序,则可以调用Win32 API ISWOW64进程来了解您是否处于64位操作系统中 当然,如果您编写64位exe,它将只在64位Wi

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

如果a)您使用windows,b)您可以访问注册表,那么HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\windows NT\CurrentVersion应该提供信息。

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

但是,如果您编写32位程序,则可以调用Win32 API ISWOW64进程来了解您是否处于64位操作系统中


当然,如果您编写64位exe,它将只在64位Windows上运行,因此无需询问。

您需要使用
GetProcAddress()
在运行时检查函数的可用性,如下所示:

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

缓存此函数结果是安全的,因为API函数将存在或不存在,并且其结果不能在同一Windows安装上更改。甚至可以从多个线程同时调用该函数,因为两个线程发现
WasCalled
False
都将调用该函数,将相同的结果写入相同的内存位置,并且仅在之后将
WasCalled
设置为
True
,以及
IsWow64Process
,您可能对API函数感兴趣(它是在
Windows
单元中定义的),以了解有关您所在CPU的更多信息(或者您可以使用汇编和
CPUID
)。

//未测试,但您可以尝试此方法

is64 := (Environment.GetEnvironmentVariable('ProgramW6432') <> '');
is64:=(Environment.GetEnvironmentVariable('ProgramW6432')”;
用于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;

“电脑”?“阿巴特”?“程序学”?请在发帖前花点时间阅读您的问题。@Joachim Sauer:StackOverflow是一个国际论坛,您不能期望每个人都有完美的英语-只要纠正恼人的语法错误。@Serg:不完美的英语和简单的打字错误是两码事。我很确定“about”是后者。我对不完美的英语一点问题都没有(我自己也不是一个以英语为母语的人)。我正在使用windows@gedO你在自相矛盾。Windows意味着注册表。尝试从“开始”菜单运行“regedit”。如果程序需要多次知道答案,则最好缓存结果。i、 您不希望在循环中调用它,因为LoadLibrary将非常昂贵,尤其是当它找不到任何东西时。我不是在抨击解决方案,只是在使用案例上给出建议。只有在项目设置中启用了可分配/可写常量时,此代码才会编译。为了避免对此编译器设置敏感,请引入指令以确保按照此代码的要求设置(并还原)此编译器行为,或者更好的做法是,我建议对缓存结果使用一个单位变量(使用整数可避免使用两个这样的变量:例如,declare initialized=-1表示“未设置”,对于Win32,set=0;对于Win32,set=1)。祝您在使用Delphi编写64位exe时好运。;)现在正在做。(2015)这个问题被标记为
delphi
,没有提到.net或Java。因此,您不能假设
环境
可用。在回答问题之前,请阅读标签,以确保您的答案适用于他们。如果您不确定,您可能不应该回答这个问题。:-)Delphi编码人员将到达那里,注意到它必须有一个已定义的对象环境,因此他将删除它:is64:=({Environment.}GetEnvironmentVariable('ProgramW6432')”);非常感谢。TOSVersion是在XE2上引入的,这个问题是关于Delphi 2007的。@bummi实际上这个问题没有指定Delphi的哪个版本。过去可能有,但现在没有。所以这个答案是正确的:)
lbl1.Caption := IsWin64Or32;
function TForm2.Arch: string;
begin
if TOSVersion.Architecture=arIntelX86 then
   Result := '32-bit' Else  Result := '64-bit'
end;