Модуль содержит функции для работы с блоками памяти.
AllocateMem - выделяет блок памяти из Count записей по RecSize байт, возвращает адрес выделенного блока памяти в случае успеха или nil в случае ошибки.
ReallocateMem - устанавливает новый размер блока памяти, выделенного функцией AllocateMem. В качестве параметра Pointer можт быть использован как
типизированный так и нетипизированный указатель.
DeallocateMem - освобождает память, выделенную функциями AllocateMem или ReallocateMem. В качестве параметра Pointer можт быть использован как
типизированный так и нетипизированный указатель.
MemSize - возвращает размер блока памяти, выделенного функциями AllocateMem или ReallocateMem.
Code: |
Зависимости: Windows Автор: Dimka Maslov, mainbox @endimus.ru, ICQ:148442121, Санкт-Петербург Copyright: Dimka Maslov Дата: 21 мая 2012 г. ***************************************************** } unit MemFuncs; uses Windows; interface function AllocateMem(Count: Integer; RecSize: Integer): Pointer; procedure ReallocateMem(var Pointer; Count: Integer; RecSize: Integer = 1); procedure DeallocateMem(var Pointer); function MemSize(P: Pointer): Integer;
implementation
function LocalHandle; external kernel32 name'LocalHandle';
function AllocateMem(Count: Integer; RecSize: Integer = 1): Pointer; asm test eax, eax jle @@10 test edx, edx jle @@10 imul edx push eax push LHND call LocalAlloc push eax call LocalLock ret @@10: xor eax, eax end;
procedure ReallocateMem(var Pointer; Count: Integer; RecSize: Integer = 1); asm push ebx mov ebx, eax mov eax, [ebx] test eax, eax jnz @@10 mov eax, edx mov edx, ecx call AllocateMem mov [ebx], eax pop ebx ret @@10: push ecx push edx push eax call LocalHandle pop edx pop ecx test eax, eax jnz @@20 pop ebx ret @@20: push eax mov eax, edx imul ecx mov edx, eax pop eax push LHND push edx push eax call LocalRealloc push eax call LocalLock mov [ebx], eax pop ebx end;
procedure DeallocateMem(var Pointer); asm push ebx mov ebx, eax mov eax, [ebx] test eax, eax jz @@10 push eax call LocalHandle test eax, eax jz @@10 push eax push eax call LocalUnlock call LocalFree @@10: xor eax, eax mov [ebx], eax pop ebx end;
function MemSize(P: Pointer): Integer; asm test eax, eax jnz @@10 ret @@10: push eax call LocalHandle test eax, eax jnz @@20 ret @@20: push eax call LocalSize end;
end. |
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!