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

问题描述:

我如何获得有关Windows操作系统类型的信息?它是32位还是64位?我如何以编程方式获取这些信息?如何获取有关计算机的信息? [32位或64位]

+2

“compiuter”? “abaout”? “programory”?请在发布之前花时间阅读您的问题。 – 2010-03-26 14:32:59

+4

@Joachim Sauer:*是一个国际论坛,你不能指望每个人都有完美的英语 - 只需修复烦人的语法错误即可。 – kludg 2010-03-26 15:34:01

+1

@Serg:不完美的英文和简单的错别字是两个不同的东西。我很确定,“abaout”是后者。我对英语不完全没有任何问题(我本人不是母语)。 – 2010-03-26 15:51:56

您需要使用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将阻止您的应用程序在SP2以前的Windows 2000或Windows XP上运行。

编辑:

克里斯已经张贴了关于缓存出于性能的考虑结果的评论。对于这个特定的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安装改变。甚至可以安全地从多个线程同时调用它,因为找到WasCalledFalse10的两个线程都将调用该函数,将相同的结果写入相同的内存位置,并且之后仅将WasCalled设置为True

+0

如果程序需要多次知道答案,缓存结果将是一个好主意。即你不想在循环中调用它,因为LoadLibrary会很昂贵,特别是当它找不到任何东西时。我并没有敲响解决方案,只是提供使用案例的建议。 – 2010-03-26 18:02:22

+2

只有在项目设置中启用了可分配/可写常量时,此代码才会编译。为了避免对此编译器设置敏感,可以引入指令以确保根据需要设置(并恢复)该编译器行为,或者更好,我建议使用单位变量作为缓存结果(使用整数避免需要使用两个这样的变量:例如声明initialised = -1表示“未设置”,set = 0表示Win32 set = 1表示Win64)。 – Deltics 2010-03-28 20:23:46

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

+0

对不起,但没有注册表。我正在使用windows – gedO 2010-03-26 14:33:56

+5

@gedO:你是自相矛盾的。 Windows意味着注册表。尝试从开始菜单运行“regedit”。 – Brian 2010-03-26 14:36:14

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

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

当然,如果你编写一个64位的exe文件,它只能运行在64位的Windows上,所以不需要问。

+0

祝你用Delphi写一个64位的exe文件。 ;) – Deltics 2010-03-28 20:19:03

+0

刚才这样做。 (2015) – penarthur66 2015-05-26 14:58:06

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; 

除了IsWow64Process,将GetNativeSystemInfo API函数可能是你的兴趣(它在Windows单元定义),以了解更多有关你的CPU(或者你可以使用装配和CPUID)。

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

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

这个问题被标记为'delphi',并没有提及.net或Java。因此,你不能假定'Environment'可用。请在回答问题之前阅读标签,以确保您的答案适用于他们。如果你不确定,你可能不应该回答这个问题。 :-) – 2013-03-18 17:59:25

+0

德尔福的编码器会到达那里,注意到它必须有一个定义的对象环境,因此他会删除它: is64:=({Environment。} GetEnvironmentVariable('ProgramW6432')''); 谢谢! – 2013-05-23 02:55:31

德尔福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; 

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

在XE2上引入了TOSVersion,问题是关于Delphi 2007。 – bummi 2014-11-16 09:25:49