Jak wyświetlić ilość RAM >4GB?

0

Cześć.
Tmemorystatus uparcie zwraca 4GB. Próbowałem GlobalMemoryStatusEx też 4GB. Chodzi o kompilatory 32bitowe Lazarus bądź DelphiXE, w obu przypadkach to samo. Zna ktoś sposób na wyświetlenie ilości pamięci RAM > 4GB ?

0
  1. jaki system
  2. kod
  3. u mnie na D XE DWORDLONG = UInt64; więc jest OK
0
  1. System Win7 64bit, 32-bitowy Lazarus.

  2. Kod:

procedure GetMemInfo(var TPRAM, APRAM : Qword);
var
   Ram: TmemoryStatus;
begin
  TPRAM:=Ram.dwTotalPhys;
  APRAM:=Ram.dwAvailPhys;
end;   
  1. Próbowałem róznych typów i to samo...
0

MSDN:

On computers with more than 4 GB of memory, the MEMORYSTATUS structure can return incorrect information, reporting a value of –1 to indicate an overflow. If your application is at risk for this behavior, use the GlobalMemoryStatusEx function instead of the GlobalMemoryStatus function.

0

procedure TContainer.GetMemory();
var
  FMemory: TMemoryStatusEx;
  FProcesMemory: PPROCESS_MEMORY_COUNTERS;
  FTotal: NativeInt;
  FSize: NativeInt;
begin
  try
    if csDestroying in Self.ComponentState then
      Exit;

    try
      FSize := SizeOf(FProcesMemory^);
      GetMem(FProcesMemory, FSize);
      FProcesMemory^.cb := FSize;
      FillChar(FMemory, SizeOf(FMemory), 0);
      FMemory.dwLength := SizeOf(FMemory);
      GlobalMemoryStatusEx(FMemory);
      FTotal := FMemory.ullTotalPhys div 1024;
    finally
      FreeMem(FProcesMemory, SizeOf(FProcesMemory^));
    end;
  except
  end;
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;

Dziala i pobiera pamiec w 32bit aplikacji > 4GB

1 użytkowników online, w tym zalogowanych: 0, gości: 1