Получение локального блока памяти
Для получения локального блока памяти вы должны использовать функцию LocalAlloc :
HLOCAL WINAPI LocalAlloc(UINT fuAlloc, UINT cbAlloc);
Параметр fuAlloc определяет тип выделяемой памяти. Размер блока памяти в байтах должен передаваться через параметр cbAlloc.
Функция возвращает идентификатор локального блока памяти или NULL, если Windows не может выделить память указанного объема.
Параметра fuAlloc должен быть указан как логическая комбинация следующих значений:
Флаг | Описание |
LMEM_DISCARDABLE | Заказывается удаляемый блок памяти. Этот флаг должен использоваться совместно с флагом LMEM_MOVEABLE |
LMEM_FIXED | Заказывается фиксированный блок памяти (в защищенном режиме работы блок памяти будет перемещаемым, даже если он заказан с использованием флага LMEM_FIXED, однако в процессе перемещения будет изменяться только линейный адрес, но не логический). Этот флаг несовместим с флагом LMEM_MOVEABLE |
LMEM_MOVEABLE | Заказывается перемещаемый блок памяти. Логический адрес такого блока может изменяться в процессе перемещения. Этот флаг несовместим с флагом LMEM_FIXED |
LMEM_NOCOMPACT | Для удовлетворения запроса памяти не следует выполнять объединение всех свободных участков памяти в один и удалять блоки памяти, отмеченные как удаляемые |
LMEM_NODISCARD | Для удовлетворения запроса памяти не следует выполнять объединение всех свободных участков памяти в один |
LMEM_ZEROINIT | Во все байты блока необходимо записать нулевые значения |
NONZEROLHND | Синоним для LMEM_MOVEABLE |
NONZEROLPTR | Синоним для LMEM_FIXED |
LHDN | Синоним для комбинации флагов LMEM_MOVEABLE и LMEM_ZEROINIT |
LPTR | Синоним для комбинации флагов LMEM_FIXED и LMEM_ZEROINIT |
Приведем фрагмент кода, в котором мы получаем из локальной области памяти перемещаемый блок размером 2000 байт, причем во все байты полученного блока записываются нулевые значения:
hmemLocal = LocalAlloc(LHND, 2000);
В следующем фрагменте мы заказываем удаляемый блок памяти размером 200 байт, который никак не инициализируется:
hmemLocalDisc = LocalAlloc( LMEM_MOVEABLE | LMEM_DISCARDABLE, 200);