GlobalMemoryStatusEx

GlobalMemoryStatus API では、物理メモリは上限2GBまでしかとれない。


type
DWORDLONG = int64;
_MEMORYSTATUSEX = packed record
dwLength : DWORD;
dwMemoryLoad : DWORD;
ullTotalPhys : DWORDLONG;
ullAvailPhys : DWORDLONG;
ullTotalPageFile : DWORDLONG;
ullAvailPageFile : DWORDLONG;
ullTotalVirtual : DWORDLONG;
ullAvailVirtual : DWORDLONG;
ullAvailExtendedVirtual : DWORDLONG;
end;
MEMORYSTATUSEX = _MEMORYSTATUSEX;
LPMEMORYSTATUSEX = ^_MEMORYSTATUSEX;

function GlobalMemoryStatusEx(const ApMemoryStatusEx : LPMEMORYSTATUSEX) : Bool; stdcall; external 'kernel32.dll';

procedure TForm1.Button1Click(Sender: TObject);

var
pmse : LPMEMORYSTATUSEX;

begin
pmse := AllocMem(SizeOf(_MEMORYSTATUSEX));
pmse^.dwLength := SizeOf(_MEMORYSTATUSEX);
try
if not GlobalMemoryStatusEx(pmse) then begin
ShowMessage(SysErrorMessage(GetLastError));
end;
finally
FreeMem(pmse,SizeOf(_MEMORYSTATUSEX));
end;

これで、2BG以上でも取得できる。ただし、Windows200以上のOSの場合。
限界は、int64の範囲内になる。超えると、マイナスになっちゃうんだろうな。
32ビットOSでは、これぐらいでいいのではないだろうか?
これ以上は、64ビットで確認するようにしたいものです。

pmse^.dwLength := SizeOf(_MEMORYSTATUSEX);
が必要なのをメーリングリストで教えてもらいました。感謝!