Delphi 2007: 使用GlobalMemoryStatus获取总内存RAM

5

我需要用Delphi 2007获取系统的总物理内存。在4GB或更多的系统上使用GlobalMemoryStatus似乎会给我带来错误。在Delphi 2007中,GlobalMemoryStatusEx不存在,所以我手动将函数调用添加到了我的程序中。它在我的Windows 7 x64上正确返回8GB的内存,但在Vista x32系统上仍然返回一个不正确的值(应该是4GB,但返回2.9GB)。您有什么想法我可能做错了什么吗?而且,GlobalMemoryStatusEx能在旧操作系统上工作吗?

type
  DWORDLONG = UInt64;

  PMemoryStatusEx = ^TMemoryStatusEx;
  TMemoryStatusEx = packed record
    dwLength: DWORD;
    dwMemoryLoad: DWORD;
    ullTotalPhys: DWORDLONG;
    ullAvailPhys: DWORDLONG;
    ullTotalPageFile: DWORDLONG;
    ullAvailPageFile: DWORDLONG;
    ullTotalVirtual: DWORDLONG;
    ullAvailVirtual: DWORDLONG;
    ullAvailExtendedVirtual: DWORDLONG;
  end;

function GlobalMemoryStatusEx(var lpBuffer: TMemoryStatusEx): BOOL; stdcall; external kernel32;

function getmemorysize:word;
var
  memory: TMemoryStatusEx;
begin
  FillChar(memory, SizeOf(memory), 0);
  memory.dwLength := SizeOf(memory);
  GlobalMemoryStatusEx(memory);
  result:=memory.ullTotalPhys div (1024*1024);
end;

http://blogs.msdn.com/b/hiltonl/archive/2007/04/13/the-3gb-not-4gb-ram-problem.aspx - Sertac Akyuz
@SertacAkyuz,这回答了我的Vista问题,但是你知道上面的代码是否适用于像Windows XP这样的旧操作系统吗?我有点担心,因为我不得不手动添加GlobalMemoryStatusEx的原型。谢谢。 - Evan Zimmerman
Ace - 可能由于IDE支持Win9x,声明丢失了,不用担心。@Ken - 完成了,谢谢。 - Sertac Akyuz
1个回答

3
这是可以预料的,你没有做错任何事情。在32位操作系统上,Windows不会报告4GB RAM。以下是来自MSDN 博客文章“3GB而非4GB RAM问题”的引用:
由于很久以前做出的架构决策,如果你安装了4GB物理RAM,Windows只能报告物理4GB RAM的一部分(范围从约2.75GB到3.5GB,具体取决于安装的设备、主板芯片组和BIOS)。 GlobaMemoryStatusEx应该适用于Windows 2000及以上版本(较新的MSDN文档将其排除在Win2K之外,但早期的文档中有它)。

博客的链接已经失效了 :-( - Michael Hutter
1
@Michael - 这里是一个存档文件。 - Sertac Akyuz

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