Операционная система Microsoft Windows 3.1 для программиста -том 3

Фиксирование и расфиксирование блока памяти


Для получения доступа к полученному блоку памяти его необходимо зафиксировать, вызвав функцию GlobalLock :

void FAR* WINAPI GlobalLock(HGLOBAL hglb);

Функция GlobalLock фиксирует блок памяти, идентификатор которого передается ей через параметр hglb и возвращает логический адрес зафиксированного блока или NULL, если указанный блок удален или произошла ошибка.

В защищенном режиме работы Windows продолжает перемещать блоки памяти, зафиксированные функцией GlobalLock, изменяя базовый адрес в локальной таблице дескрипторов. Даже для фиксированных блоков памяти вызов этой функции все же необходим, потому что нужно получить логический адрес блока памяти.

Для каждого блока памяти Windows поддерживает счетчик фиксирований. Этот счетчик увеличивается при вызове функции GlobalLock и уменьшается при расфиксировании блока функцией GlobalUnlock :

BOOL WINAPI GlobalUnlock(HGLOBAL hglb);

Если содержимое счетчика уменьшилось до нуля, функция возвращает значение FALSE. В противном случае возвращается TRUE.

Файл windowsx.h содержит макрокоманды, облегчающие работу с глобальными блоками памяти. Например, макрокоманда GlobalAllocPtr получает блок памяти и фиксирует его:

#define GlobalAllocPtr(flags, cb) \ (GlobalLock(GlobalAlloc((flags), (cb))))

В данном случае идентификатор полученного блока памяти не сохраняется, так как он не нужен. Вы можете освободить блок памяти, зная только его логический адрес (см. следующий раздел).



Содержание раздела