DelphXE:GlobalMemoryStatus 与 GlobalMemoryStatusex

Pet*_*tra 1 delphi

我使用的是DelphiIXE。

我了解到 GlobalMemoryStatus 在 64 台 RAM 超过 4G 的计算机上可能会返回错误结果,因此应该使用 GlobalMemoryStatusex。

但是,另一方面,如果我在 32 位计算机上使用 GlobalMemoryStatusex,结果也会错误(返回的数字为 0 或巨大)。

当然我可以准备两个程序:一个用于64位计算机,一个用于32位计算机,并使用正确的内存状态,但是有没有办法使用相同的调用或识别计算机是64位的?并做类似的事情:

if comp64 then  begin
   GlobalMemoryStatusex 
   ....
end
else begin
   GlobalMemoryStatus 
   ....
end;
Run Code Online (Sandbox Code Playgroud)

这是我现在使用的代码:

var 
  MS1: TMemoryStatusex;
begin
  GlobalMemoryStatusex(MS1);
  showmessage('KiloBytes of physical memory: '+FormatFloat('#,###" KB"', MS1.ullTotalPhys / 1024)+chr(10)+
              'Percent of memory in use: '+Format('%d%%', [MS1.dwMemoryLoad])+chr(10)+
              'KiloBytes of free physical memory: '+FormatFloat('#,###" KB"', MS1.ullAvailPhys /1024)+chr(10)+chr(10)+
              'KiloBytes of paging file space: '+FormatFloat('#,###" KB"', MS1.ullTotalPageFile / 1024)+chr(10)+
              'KiloBytes of free paging file space: '+FormatFloat('#,###" KB"', MS1.ullAvailPageFile / 1024)+chr(10)+chr(10)+
              'KiloBytes of virtual address space: '+FormatFloat('#,###" KB"', MS1.ullTotalVirtual / 1024)+chr(10)+
              'KiloBytes of free virtual address space: '+FormatFloat('#,###" KB"', MS1.ullAvailVirtual / 1024) );
Run Code Online (Sandbox Code Playgroud)

提前致谢。


TOndrej,这是代码:

var MS1:TMemoryStatusex;
    GlobalMemoryStatusex(MS1);
    showmessage('KiloBytes of physical memory: '+FormatFloat('#,###" KB"', MS1.ullTotalPhys / 1024)+chr(10)+
                 'Percent of memory in use: '+Format('%d%%', [MS1.dwMemoryLoad])+chr(10)+
                 'KiloBytes of free physical memory: '+FormatFloat('#,###" KB"', MS1.ullAvailPhys /1024)+chr(10)+chr(10)+
                 'KiloBytes of paging file space: '+FormatFloat('#,###" KB"', MS1.ullTotalPageFile / 1024)+chr(10)+
                 'KiloBytes of free paging file space: '+FormatFloat('#,###" KB"', MS1.ullAvailPageFile / 1024)+chr(10)+chr(10)+
                 'KiloBytes of virtual address space: '+FormatFloat('#,###" KB"', MS1.ullTotalVirtual / 1024)+chr(10)+
                 'KiloBytes of free virtual address space: '+FormatFloat('#,###" KB"', MS1.ullAvailVirtual / 1024) );
Run Code Online (Sandbox Code Playgroud)

Ond*_*lle 5

看来您没有初始化结构,也没有检查返回代码。这是一个应该可以工作的可编译项目:

program Project1;

{$APPTYPE CONSOLE}

uses
  Windows,
  Classes,
  SysUtils;

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;

procedure Main;
var
  MemStatus: TMemoryStatusEx;
begin
  // initialize the structure
  FillChar(MemStatus, SizeOf(MemStatus), 0);
  MemStatus.dwLength := SizeOf(MemStatus);
  // check return code for errors
  Win32Check(GlobalMemoryStatusEx(MemStatus));

  Writeln(Format('dwLength: %d', [MemStatus.dwLength]));
  Writeln(Format('dwMemoryLoad: %d', [MemStatus.dwMemoryLoad]));
  Writeln(Format('ullTotalPhys: %d', [MemStatus.ullTotalPhys]));
  Writeln(Format('ullAvailPhys: %d', [MemStatus.ullAvailPhys]));
  Writeln(Format('ullTotalPageFile: %d', [MemStatus.ullTotalPageFile]));
  Writeln(Format('ullAvailPageFile: %d', [MemStatus.ullAvailPageFile]));
  Writeln(Format('ullTotalVirtual: %d', [MemStatus.ullTotalVirtual]));
  Writeln(Format('ullAvailVirtual: %d', [MemStatus.ullAvailVirtual]));
  Writeln(Format('ullAvailExtendedVirtual: %d', [MemStatus.ullAvailExtendedVirtual]));
end;

begin
  try
    Main;
  except
    on E: Exception do
    begin
      ExitCode := 1;
      Writeln(Format('[%s] %s', [E.ClassName, E.Message]));
    end;
  end;
end.
Run Code Online (Sandbox Code Playgroud)