ВУЗ:
Составители:
55
#define GHND (GMEM_MOVEABLE | GMEM_ZEROINIT)
Флаг GMEM_MOVEABLE позволяет перемещать блок памяти в виртуальной
памяти, при этом функция возвращает не адрес выделенного блока, а 32-разрядный
описатель (дескриптор) блока памяти. Это необязательно означает, что блок памяти
будет перемещен в физической памяти, но адрес, которым пользуется программа
для чтения и записи, может измениться. Для фиксации блока используется вызов:
p =(int *)GlobalLock(hGlobal);
Эта функция преобразует описатель памяти в указатель. Пока блок
зафиксирован, Windows не изменяет его виртуальный адрес. Когда работа с блоком
заканчивается, для снятия фиксации вызывается функция:
GlobalUnlock(hGlobal);
Этот вызов дает Windows свободу перемещать блок в виртуальной памяти.
Для того чтобы правильно осуществлять этот процесс следует фиксировать и
снимать фиксацию блока памяти в ходе обработки одного сообщения. Когда нужно
освободить перемещаемую память, надо вызывать функцию GlobalFree с
описателем, но не с указателем на блок памяти.
Если в данный момент нет доступа к описателю, то необходимо использовать
функцию:
hGlobal = GlobalHandle(p);
Для преднамеренного удаления блока памяти можно использовать следующий
вызов:
GlobalDiscard(hGlobal);
Другим доступным для использования в функции GlobalAlloc является флаг
GMEM_SHARE или GMEM_DDESHARE (идентичны). Как следует из его имени,
этот флаг предназначен для динамического обмена данными. Функции GlobalAlloc
и GlobalReAlloc могут также включать флаги GMEM_NODISCARD и
GMEM_NOCOMPACT. Эти флаги дают указание Windows не удалять и не
перемещать блоки памяти для удовлетворения запросов памяти.
Функция GlobalFlags возвращает комбинацию флагов
GMEM_DISCARDABLE, GMEM_DISCARDED и GMEM_SHARE. Наконец, вы
можете вызвать функцию GlobalMemoryStatus (для этой функции нет функции –
двойника со словом Local) с указателем на структуру типа MEMORYSTATUS для
определения количества физической и виртуальной памяти, доступной
приложению.
Windows также поддерживает некоторые функции, реализованные
программистом или дублирующие библиотечные функции C. Это функции
FreeMemory (заполнение конкретным байтом), ZeroMemory (обнуление памяти),
CopyMemory и MoveMemory – обе копируют данные из одной области памяти в
другую. Если эти области перекрываются, то функция CopyMemory может работать
некорректно. Вместо нее используйте функцию MoveMemory.
Windows поддерживает ряд функций, начинающихся со слова Virtual. Эти
функции предоставляют значительно больше возможностей управления памятью.
Однако, только очень необычные приложения требуют использования этих
функций.
Последняя группа функций работы с памятью – это функции, имена которых
#define GHND (GMEM_MOVEABLE | GMEM_ZEROINIT)
Флаг GMEM_MOVEABLE позволяет перемещать блок памяти в виртуальной
памяти, при этом функция возвращает не адрес выделенного блока, а 32-разрядный
описатель (дескриптор) блока памяти. Это необязательно означает, что блок памяти
будет перемещен в физической памяти, но адрес, которым пользуется программа
для чтения и записи, может измениться. Для фиксации блока используется вызов:
p =(int *)GlobalLock(hGlobal);
Эта функция преобразует описатель памяти в указатель. Пока блок
зафиксирован, Windows не изменяет его виртуальный адрес. Когда работа с блоком
заканчивается, для снятия фиксации вызывается функция:
GlobalUnlock(hGlobal);
Этот вызов дает Windows свободу перемещать блок в виртуальной памяти.
Для того чтобы правильно осуществлять этот процесс следует фиксировать и
снимать фиксацию блока памяти в ходе обработки одного сообщения. Когда нужно
освободить перемещаемую память, надо вызывать функцию GlobalFree с
описателем, но не с указателем на блок памяти.
Если в данный момент нет доступа к описателю, то необходимо использовать
функцию:
hGlobal = GlobalHandle(p);
Для преднамеренного удаления блока памяти можно использовать следующий
вызов:
GlobalDiscard(hGlobal);
Другим доступным для использования в функции GlobalAlloc является флаг
GMEM_SHARE или GMEM_DDESHARE (идентичны). Как следует из его имени,
этот флаг предназначен для динамического обмена данными. Функции GlobalAlloc
и GlobalReAlloc могут также включать флаги GMEM_NODISCARD и
GMEM_NOCOMPACT. Эти флаги дают указание Windows не удалять и не
перемещать блоки памяти для удовлетворения запросов памяти.
Функция GlobalFlags возвращает комбинацию флагов
GMEM_DISCARDABLE, GMEM_DISCARDED и GMEM_SHARE. Наконец, вы
можете вызвать функцию GlobalMemoryStatus (для этой функции нет функции –
двойника со словом Local) с указателем на структуру типа MEMORYSTATUS для
определения количества физической и виртуальной памяти, доступной
приложению.
Windows также поддерживает некоторые функции, реализованные
программистом или дублирующие библиотечные функции C. Это функции
FreeMemory (заполнение конкретным байтом), ZeroMemory (обнуление памяти),
CopyMemory и MoveMemory – обе копируют данные из одной области памяти в
другую. Если эти области перекрываются, то функция CopyMemory может работать
некорректно. Вместо нее используйте функцию MoveMemory.
Windows поддерживает ряд функций, начинающихся со слова Virtual. Эти
функции предоставляют значительно больше возможностей управления памятью.
Однако, только очень необычные приложения требуют использования этих
функций.
Последняя группа функций работы с памятью – это функции, имена которых
55
Страницы
- « первая
- ‹ предыдущая
- …
- 53
- 54
- 55
- 56
- 57
- …
- следующая ›
- последняя »
