如何获取有关计算机的信息? [32位或64位]
您需要使用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安装改变。甚至可以安全地从多个线程同时调用它,因为找到WasCalled
为False
10的两个线程都将调用该函数,将相同的结果写入相同的内存位置,并且之后仅将WasCalled
设置为True
。
如果程序需要多次知道答案,缓存结果将是一个好主意。即你不想在循环中调用它,因为LoadLibrary会很昂贵,特别是当它找不到任何东西时。我并没有敲响解决方案,只是提供使用案例的建议。 – 2010-03-26 18:02:22
只有在项目设置中启用了可分配/可写常量时,此代码才会编译。为了避免对此编译器设置敏感,可以引入指令以确保根据需要设置(并恢复)该编译器行为,或者更好,我建议使用单位变量作为缓存结果(使用整数避免需要使用两个这样的变量:例如声明initialised = -1表示“未设置”,set = 0表示Win32 set = 1表示Win64)。 – Deltics 2010-03-28 20:23:46
我不知道如何在Delphi中调用Win32函数。
但是,如果您编写一个32位程序,您可以调用Win32 API IsWow64Process来了解您是否在64位操作系统中。
当然,如果你编写一个64位的exe文件,它只能运行在64位的Windows上,所以不需要问。
祝你用Delphi写一个64位的exe文件。 ;) – Deltics 2010-03-28 20:19:03
刚才这样做。 (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;
//没有测试但你可以试试这个
is64 := (Environment.GetEnvironmentVariable('ProgramW6432') <> '');
这个问题被标记为'delphi',并没有提及.net或Java。因此,你不能假定'Environment'可用。请在回答问题之前阅读标签,以确保您的答案适用于他们。如果你不确定,你可能不应该回答这个问题。 :-) – 2013-03-18 17:59:25
德尔福的编码器会到达那里,注意到它必须有一个定义的对象环境,因此他会删除它: 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;
在XE2上引入了TOSVersion,问题是关于Delphi 2007。 – bummi 2014-11-16 09:25:49
“compiuter”? “abaout”? “programory”?请在发布之前花时间阅读您的问题。 – 2010-03-26 14:32:59
@Joachim Sauer:StackOverflow是一个国际论坛,你不能指望每个人都有完美的英语 - 只需修复烦人的语法错误即可。 – kludg 2010-03-26 15:34:01
@Serg:不完美的英文和简单的错别字是两个不同的东西。我很确定,“abaout”是后者。我对英语不完全没有任何问题(我本人不是母语)。 – 2010-03-26 15:51:56