NicoDE hat
hier nochmal eine etwas veränderte Version bereit gestellt:
Delphi-Quellcode:
function MyGlobalMemoryStatus(var ABuffer: TMemoryStatusEx): BOOL; stdcall;
type
TFNGlobalMemoryStatusEx = function(var ABuffer: TMemoryStatusEx): BOOL; stdcall;
const
FallbackSize = $38; // FieldOffset(TMemoryStatusEx, ullAvailExtendedVirtual)
{$WRITEABLECONST ON}
const
Initialized: Integer = 0;
FNMemStatEx: TFNGlobalMemoryStatusEx = nil;
{$WRITEABLECONST OFF}
var
Status: TMemoryStatus;
begin
if Initialized = 0 then
begin
FNMemStatEx := TFNGlobalMemoryStatusEx(
GetProcAddress(GetModuleHandle(kernel32), 'GlobalMemoryStatusEx'));
InterlockedIncrement(Initialized);
end;
if Assigned(FNMemStatEx) then
Result := FNMemStatEx(ABuffer)
else if ABuffer.dwLength < FallbackSize then
begin
SetLastError(ERROR_INVALID_PARAMETER);
Result := False;
end
else
begin
FillChar(Status, SizeOf(TMemoryStatus), 0);
GlobalMemoryStatus(Status);
Result := (Status.dwLength = SizeOf(TMemoryStatus));
if Result then
begin
FillChar(ABuffer, ABuffer.dwLength, 0);
ABuffer.dwLength := FallbackSize;
ABuffer.dwMemoryLoad := Status.dwMemoryLoad;
with ABuffer, Status do
begin
TULargeInteger(ullTotalPhys).LowPart := dwTotalPhys;
TULargeInteger(ullAvailPhys).LowPart := dwAvailPhys;
TULargeInteger(ullTotalPageFile).LowPart := dwTotalPageFile;
TULargeInteger(ullAvailPageFile).LowPart := dwAvailPageFile;
TULargeInteger(ullTotalVirtual).LowPart := dwTotalVirtual;
TULargeInteger(ullAvailVirtual).LowPart := dwAvailVirtual;
end;
end;
end;
end;
Der Unterschied besteht darin, dass hier automatisch eine Fallback-Lösung auf
GlobalMemoryStatus statt findet, wenn die entsprechende
Ex-Version nicht verfügbar ist.
Anwendungsbeispiel:
Delphi-Quellcode:
var
buf: TMemoryStatusEx;
begin
buf.dwLength := SizeOf(TMemoryStatusEx);
if (
not MyGlobalMemoryStatus(buf))
then
RaisLastOSError;
Memo1.Lines.Clear;
Memo1.Lines.Add('
RAM verfügbar: ' + buf.ullTotalPhys + '
Bytes');
// ...
end;