在Windows 7上使用Delphi 2010安装超过4 GB的内存时,有没有办法获得总内存和可用内存?
此代码的返回值不超过3.99 GB:
var
Memory: TMemoryStatus;
Memory.dwLength := SizeOf( Memory );
GlobalMemoryStatus( Memory );
dwTotalPhys1.Caption := 'Total memory: ' + IntToStr( Memory.dwTotalPhys ) + ' Bytes ' + '(' + FormatByteSize
( Memory.dwTotalPhys ) + ')';
dwAvailPhys1.Caption := 'Available memory: ' + IntToStr( Memory.dwAvailPhys ) + ' Bytes ' + FormatByteSize
( Memory.dwAvailPhys ) + ')';
答案 0 :(得分:15)
您需要使用GlobalMemoryStatusEx。 GlobalMemoryStatus
限制为4gb
我不知道它是否已经在Delphi中定义了它的结构TMemoryStatusEx
(它将基于Windows API的MEMORYSTATUSEX。)
您需要查看的字段为ullTotalPhys
和ullAvailPhys
。它们是64位无符号整数。
我忘记了,它只受Windows> = 2000支持,但这不应该是一个问题了。
答案 1 :(得分:2)
@Bill
您需要使用GlobalMemoryStatusEx。它并不完美,但它比GlobalMemoryStatus更好。
怎么样?使用GlobalMemoryStatus,在配备Win32的4GB计算机上,32位应用程序仅显示2GB安装。使用GlobalMemoryStatusEx,同一个应用程序将显示3GB安装。更接近真相!
此代码与Delphi XE(及以上版本)中的代码一样:
uses Windows;
function GetSystemMem: string; { Returns installed RAM (as viewed by your OS) in GB, with 2 decimals }
VAR MS_Ex : MemoryStatusEx;
begin
FillChar (MS_Ex, SizeOf(MemoryStatusEx), #0);
MS_Ex.dwLength := SizeOf(MemoryStatusEx);
GlobalMemoryStatusEx (MS_Ex);
Result:= Real2Str(MS_Ex.ullTotalPhys / GB, 2)+ ' GB';
end;
请注意,如果此数量超过3GB且操作系统为Win 32,使用某些API函数可能永远不会为您提供TOTAL数量。为什么?因为Windows32本身无法“看到”所有内存!您需要直接访问BIOS并在那里读取硬件值。但是,在某些情况下可能不需要这样做:如果只能访问3,为什么还要显示你的PC有4GB内存呢?我在我的案例中做了什么,我改变了信息:
已安装的RAM:3GB(或更多)
带
可用内存:3GB
同样,我不知道这是否也适合你的情况。