Moin Corpsman,
ich habe das mal eben, quick and dirty, übersetzt:
Delphi-Quellcode:
type
DWORDLONG = LONGLONG;
_MEMORYSTATUSEX =
packed record // packed, damit keine Speicherlöcher entstehen
dwLength : DWORD;
dwMemoryLoad : DWORD;
ullTotalPhys : DWORDLONG;
ullAvailPhys : DWORDLONG;
ullTotalPageFile : DWORDLONG;
ullAvailPageFile : DWORDLONG;
ullTotalVirtual : DWORDLONG;
ullAvailVirtual : DWORDLONG;
ullAvailExtendedVirtual : DWORDLONG;
end;
TMemoryStatusEx = _MEMORYSTATUSEX;
// stdcall, weil die meisten API-Funktionen diese Aufrufkonvention verwenden
procedure GlobalMemoryStatusEx(
var ABuffer : _MEMORYSTATUSEX);
stdcall;
external '
kernel32.dll';
// Anwendung
var
ms : TMemoryStatusEx;
begin
ms.dwLength := SizeOf(ms);
// Bei dieser Funktion muss die Länge gesetzt werden
GlobalMemoryStatusEx(ms);
ShowMessage(IntToStr(ms.ullTotalPhys));
end;
So ganz gefällt mir das Ganze nicht, aber das liegt in erster Linie daran, dass ich, normaler Weise, nicht die borland-spezifische Übersetzung für Parameter verwende, wie hier, aber es ist leichter in der Anwendung, da man nicht extra Speicher reservieren, und später wieder freigeben muss.
Ein weiterer Punkt, der nicht ganz sauber ist, ist die Deklaration von DWORDLONG. LONGLONG ist als Int64 deklariert, ein DWORD sollte allerdings eigentlich ohne Vorzeichen sein. Bis wir über Rechner verfügen können, bei denen das eine Rolle spielt, haben wir wohl auch ein Delphi mit 64-Bit-Cardinal
Ausserdem könnte man die Funktion auch dynamisch importieren, und nicht statisch, wie hier, was den Vorteil hätte, vorher zu prüfen, ob die Funktion überhaupt verfügbar ist, und sie ggf. wegzulassen.
Bei statischem Import startet das Programm gar nicht erst, wenn die Funktion nicht vorhanden ist.