4

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;
4

1 に答える 1

3

これは当然のことであり、あなたは何も悪いことをしていません。Windows は 32 ビット OS で 4GB RAM を報告しません。「The 3GB-not-4GB RAM problem」というタイトルの MSDNブログ記事からの引用を次に示します。

かなり前に行われたアーキテクチャ上の決定により、4 GB の物理 RAM がインストールされている場合、Windows は物理 4 GB の RAM の一部しか報告できません (インストールされているデバイス、マザーボードのチップセットおよびBIOS)。

GlobaMemoryStatusExWindows 2000 以降で動作するはずです (後の MSDN ドキュメントでは Win2K が除外されていますが、以前のドキュメントには含まれていました)。

于 2013-11-05T15:39:25.273 に答える