В процессе написания программного обеспечения в ряде случаев возникает необходимость получения данных из физических ячеек памяти. Документации Delphi по данному вопросу, я найти не смог, поэтому хочу восполнить данный пробел.

Платформа WinNT(XP) не допускает возможность непосредственного доступа к памяти средствами Win32API. В этом случае программист должен или написать свой драйвер доступа к физической памяти или использовать native kernel32 функции ядра.

Рассмотрим второй вариант использующий объект "проекция файла" (file-mapping object), представляющем собой блок памяти(раздел) доступный двум и более процессам для совместного использования.

Совместное использование данных с помощью объекта "раздел" происходит следующим образом: Задав атрибуты с помощью функции

Сегодня мы попытаемся написать программу, которая будет показывать состояние памяти компа. Для начала определим что она будет делать. Ну самое главное что нам нужно, это сотояние физической памяти и загруженность ее в %. А дальше, по своему вкусу, добавим еще состояние виртуальной и страничной памяти. Начнем. Создай новый проект на Делфи ( File->New->Application). Теперь подумай, как тебе удобней отображать состояние памяти. Для меня лучше в Label, но можно и Edit. Ну это на твое усмотрение. Кидай на форму 7 компонентов Label (в них будет отображаться значение) и еще 7 (это будут пояснения: загруженность, всего физической, использовано физической, всего страничной, использовано страничной, всего виртуальной, использовано виртуальной). Какие не нужны, те отбрось ;) . Теперь кинь таймер (из вкладки System). Это будет наш главный элемент., поэтому поставь интервал по своему усмотрению (у меня он 400). Этот интервал будет отвечать за частоту обновления полей. Ну и для красоты брось ProgressBar ( из вкладки Win32). У тебя должно получиться что-то типа этого: Теперь приступим непосредственно к кодингу. Весь код мы будем писать в процедуру запуска таймера. А вот и код:

 

Code:

var

Status : TMemoryStatus;

begin

Status.dwLength := sizeof( TMemoryStatus );

GlobalMemoryStatus( Status );

...

 

 

 

Например через атомы:

 К счастью количество атомов ограничено 0xFFFF, так что простые функции перебора работают достаточно быстро. Вот пример как сохранять и читать значение через атомы:

 

 

Code:

function GetMemoryTotalPhys : DWord;

var

memStatus: TMemoryStatus;

begin

memStatus.dwLength := sizeOf ( memStatus );

GlobalMemoryStatus ( memStatus );

Result := memStatus.dwTotalPhys;

end;

 

 

 

Addr                Возвращает указатель на объект.

 

AllocMem        Выделяет на куче блок памяти заданного размера, заполняет его нулями и возвращает указатель на начало блока.

 

CompareMem        Выполняет бинарное сравнение двух участков памяти.

 

GetHeapStatus Возвращает текущее состояние диспетчера памяти.

 

GetMemoryManager Возвращает значения указателей полей текущего диспетчера памяти.

 

IsMemoryManagerSet Определяет, используется в настоящий момент диспетчер памяти, установленный по умолчанию, или был установлен другой диспетчер.

 

Ptr                 Возвращает указатель на адрес памяти, переданный в качестве аргумента.

 

SizeOf                 Возвращает размер памяти, занимаемый переменной.

 

SetMemoryManager Устанавливает значения полей диспетчера памяти.

 

SysFreeMem        Высвобождает память, используемую динамической переменной.

 

SysGetMem         Выделяет блок памяти заданного размера и возвращает указатель на него.

 

SysReallocMem Изменяет размер динамически распределенного блока памяти.