Получение глобального блока памяти
Для получения глобального блока памяти вы должны использовать функцию GlobalAlloc :
HGLOBAL WINAPI GlobalAlloc(UINT fuAlloc, DWORD cbAlloc);
Параметр fuAlloc определяет тип выделяемой памяти. Размер блока памяти в байтах должен передаваться через параметр cbAlloc, причем вы можете заказать блок памяти размером больше, чем 64 Кбайт. Для стандартного режима работы Windows можно заказать блок памяти размером до 1 Мбайт без 80 байт, для расширенного - до 16 Мбайт без 64 Кбайт.
Функция возвращает идентификатор глобального блока памяти или NULL, если Windows не может выделить память указанного объема.
Параметра fuAlloc должен быть указан как логическая комбинация следующих значений:
Флаг | Описание |
GMEM_DDESHARE | Блок памяти будет использоваться совместно несколькими приложениями при помощи механизма динамического обмена данными DDE |
GMEM_DISCARDABLE | Заказывается удаляемый блок памяти. Этот флаг должен использоваться совместно с флагом GMEM_MOVEABLE |
GMEM_FIXED | Заказывается фиксированный блок памяти. Этот флаг несовместим с флагом GMEM_MOVEABLE.При работе в среде Windows версии 3.1 в защищенном режиме фиксированный сегмент, созданный с использованием флага GMEM_FIXED, является перемещаемым. Для такого сегмента в процессе перемещения логический адрес не изменяется, но линейный (и, следовательно, физический) может изменяться |
GMEM_LOWER | Синоним для GMEM_NOT_BANKED. Не используется в Windows версии 3.1 |
GMEM_MOVEABLE | Заказывается перемещаемый блок памяти. Логический адрес перемещаемого блока памяти может изменяться. Этот флаг несовместим с флагом GMEM_FIXED |
GMEM_NOCOMPACT | Для удовлетворения запроса памяти не следует выполнять объединение всех свободных участков памяти в один и удалять блоки памяти, отмеченные как удаляемые |
GMEM_NODISCARD | Для удовлетворения запроса памяти не следует выполнять объединение всех свободных участков памяти в один |
GMEM_NOT_BANKED | Получить блок памяти вне фрейма дополнительной памяти EMS. Не используется в Windows версии 3.1 |
GMEM_NOTIFY | Если заказанный объект будет удален, требуется вызов процедуры извещения. Процедура извещения назначается функцией GlobalNotify и должна располагаться в фиксированном сегменте кода в библиотеке DLL. С ее помощью приложение может разрешить или запретить Windows удалять блок данных |
GMEM_SHARE | Синоним для GMEM_DDESHARE |
GMEM_ZEROINIT | Во все байты блока необходимо записать нулевые значения |
GHDN | Синоним для комбинации флагов GMEM_MOVEABLE и GMEM_ZEROINIT |
GPTR | Синоним для комбинации флагов GMEM_FIXED и GMEM_ZEROINIT |
Идентификатор, полученный от функции GlobalAlloc, нельзя использовать для адресации памяти непосредственно. Напомним, что пока вы не зафиксировали блок памяти, его логический адрес недоступен.
Приведем для примера фрагмент кода, в котором мы получаем перемещаемый блок памяти размером 200000 байт, причем во все байты полученного блока записываются нулевые значения:
hmemGlobal = GlobalAlloc(GHND, 200000l);
В следующем фрагменте мы заказываем удаляемый блок памяти размером 200000 байт, который никак не инициализируется:
hmemGlobalDisc = GlobalAlloc( GMEM_MOVEABLE | GMEM_DISCARDABLE, 200000l);