Hej,
Mam tu taki problem. Potrzebuję pobrać informacje o pamięci systemu (dla Windows XP oraz Win7/8).
Poniżej prezentuję kod, który teoretycznie powinien to zadanie spełnić (przykład na Win8.1 x64). Jest jeden szkopuł.
Według mnie, prezentowane dane nie są zgodne z tym co podaje systemowy programik informacji o systemie.
Start->Uruchom->msinfo32.exe
. Porównajcie wyniki poniższego programu oraz to co podaje system.
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('Rozmiar: x%d', [MemStatus.dwLength]));
Writeln(Format('Pamiec uzywana: %d', [MemStatus.dwMemoryLoad]) + '%');
Writeln(Format('Calkowita Pamiec Fizyczna: %f', [(MemStatus.ullTotalPhys /1024 /1024/1024)]) + ' GB');
Writeln(Format('Dostepna Pamiec Fizyczna: %f', [(MemStatus.ullAvailPhys /1024 /1024/1024)]) + ' GB');
Writeln(Format('Calkowity Rozmiar Pliku Wymiany: %f', [MemStatus.ullTotalPageFile /1024 /1024/1024]) + ' GB');
Writeln(Format('Dostepny Rozmiar Pliku Wymiany: %f', [MemStatus.ullAvailPageFile /1024 /1024/1024]) + ' GB');
Writeln(Format('Calkowita Pamiec Wirtualna: %f', [MemStatus.ullTotalVirtual /1024 /1024/1024]) + ' GB');
Writeln(Format('Dostepna Pamiec Wirtualna: %f', [MemStatus.ullAvailVirtual /1024 /1024/1024]) + ' GB');
Writeln(Format('COS = Zawsze 0: %d', [MemStatus.ullAvailExtendedVirtual]));
Readln;
end;
begin
try
Main;
except
on E: Exception do
begin
ExitCode := 1;
Writeln(Format('[%s] %s', [E.ClassName, E.Message]));
end;
end;
end.
Teraz tak. Pamiec uzywana, Calkowita Pamiec Fizyczna, Dostepna Pamiec Fizyczna są OK.
Problemy:
-
msinfo32.exe podaje ze "Całkowity rozmiar pamięci wirtualnej"=9,25GB -> program jednak taką wartość zwraca z MemStatus.ullTotalPageFile (jakby odwrotnie!)
-
msinfo32.exe podaje ze "Dostępna pamięć wirtualna"=5,81GB -> program jednak taką wartość zwraca z MemStatus.ullAvailPageFile (jakby odwrotnie!)
-
MemStatus.ullTotalVirtual oraz MemStatus.ullAvailVirtual, które powinny zwracać to co powyżej zwracają dziwne dane...
Proszę osoby obeznane z tematem o wytłumaczenie o co chodzi... Ja nie ogarniam :D
Dodam, że na Windows XP (32bit) są takie same cyrki.
A tak to wygląda:
dodanie obrazka do treści posta - Furious Programming