Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Функции для выделения, перераспределения и освобождения памяти

01.01.2007
{ **** 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.