Функции для выделения, перераспределения и освобождения памяти
Автор: Dimka Maslov
WEB-сайт: http://delphibase.endimus.com
{ **** 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.
|