Благодаря этой публикации , в которой даются советы о том, как получить виртуальный размер с помощью C / C ++, я смог написать следующую функцию Delphi:
Type
TMemoryStatusEx = packed record
dwLength: DWORD;
dwMemoryLoad: DWORD;
ullTotalPhys: Int64;
ullAvailPhys: Int64;
ullTotalPageFile: Int64;
ullAvailPageFile: Int64;
ullTotalVirtual: Int64;
ullAvailVirtual: Int64;
ullAvailExtendedVirtual: Int64;
end;
TGlobalMemoryStatusEx = function(var MSE: TMemoryStatusEx): LongBool; stdcall;
function VirtualSizeUsage: Int64;
var MSE: TMemoryStatusEx;
fnGlobalMemoryStatusEx: TGlobalMemoryStatusEx;
begin
Result := 0;
@fnGlobalMemoryStatusEx := GetProcAddress(GetModuleHandle(kernel32), 'GlobalMemoryStatusEx');
if Assigned(@fnGlobalMemoryStatusEx) then
begin
MSE.dwLength := SizeOf(MSE);
if fnGlobalMemoryStatusEx(MSE) then
Result := MSE.ullTotalVirtual-MSE.ullAvailVirtual;
end;
end;
Кажется,прекрасно работает для меня (Delphi 6, Win XP).Возможно, существует более простое решение, использующее GlobalMemoryStatus вместо GlobalMemoryStatusEx , но оно не будет работать правильно в системах с объемом памяти более 2 ГБ.