Функции для выделения, перераспределения и освобождения памяти |
Previous Top Next |
Code: |
{ **** UBPFD *********** by delphibase.endimus.com **** >> Функции для выделения/перераспределения/освобождения памяти
Модуль содержит функции для работы с блоками памяти.
AllocateMem - выделяет блок памяти из Count записей по RecSize байт, возвращает адрес выделенного блока памяти в случае успеха или nil в случае ошибки.
ReallocateMem - устанавливает новый размер блока памяти, выделенного функцией AllocateMem. В качестве параметра Pointer можт быть использован как типизированный так и нетипизированный указатель.
DeallocateMem - освобождает память, выделенную функциями AllocateMem или ReallocateMem. В качестве параметра Pointer можт быть использован как типизированный так и нетипизированный указатель.
MemSize - возвращает размер блока памяти, выделенного функциями AllocateMem или ReallocateMem.
Зависимости: Windows Автор: Dimka Maslov, mainbox@endimus.ru, ICQ:148442121, Санкт-Петербург Copyright: Dimka Maslov Дата: 21 мая 2002 г. ***************************************************** }
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. |
©Drkb::00836