Управление памятью. Глобальная память, страница 4

GlobalDiscard                            • Windows 98   • Windows 2000

Описание

Функция GlobalDiscard отбрасывает глобальный блок памяти, который был распределен с установленным флажком GMEM_MOVEABLE. Блок памяти должен быть разблокирован. Это значит, что число блокировок этого объекта памяти должно быть равно нулю. После отбрасывания блока дескриптор hMem остается применимым, хотя он не указывает на активную память. Дескриптор hMem можно использовать повторно с помощью функции GlobalReAlloc для распределения другого блока памяти. С помощью функции GlobalDiscard можно отбросить неиспользуемые блоки памяти и освободить место для других блоков. Обратите внимание, что функция GlobalFree одновременно удаляет блок памяти и объявляет недействительным дескриптор памяти, тогда как функция GlobalDiscard только отбрасывает блок памяти, а дескриптор hMem остается действительным.

Синтаксис

HGLOBAL GlobalDiscard( HGLOBAL hMem )

Параметры

hMem

HGLOBAL. Дескриптор глобального объекта памяти, возвращенного функцией GlobalAlloc или GlobalReAlloc.

Возвращаемое значение

HGLOBAL. В случае успешного выполнения — дескриптор объекта памяти; в ином случае — NULL.

Включаемый файл

winbase.h

См. также

GlobalFree, GlobalAlloc, GlobalReAlloc, Global Unlock

Пример

В следующем примере функция GlobalDiscard применяется для освобождения распределенной памяти, но сохранения действительного дескриптора. Когда пользователь выбирает пункт меню Test!, выполняется проверка дескриптора hMem для определения того, была ли уже вызвана функция GlobalAlloc. Если это действительно так, функция GlobalReAlloc применяется для повторного распределения памяти. Память используется, а затем отбрасывается.

Си.    \local-sources\chapll\ll-02.txt

GlobalFlaqs                              • Windows 98   • Windows 2000

Описание

Функция GlobalFlags возвращает состояние и число блокировок блока памяти, распределенного в глобальной куче. В линейной памяти среды Win32 не существует разницы между локальной кучей и глобальной кучей. Функция GlobalFlags проверяет, действителен ли дескриптор памяти и был ли заблокирован блок памяти более одного раза.

Синтаксис

UINT GlobalFlags( HGLOBAL hMem )

Значение

Описание

GHND

Комбинация флажков GMEM_MOVEABLE и GMEM_ZEROINIT.

GMEMJ4XED

Распределяет неподвижную память. Не может бьпъ объединен с флажком GMEM_MOVEABLE или GMEM_DISCARDABLE. Возвращаемое значение — указатель на блок памяти. Для доступа к памяти необходимо привести возвращаемое значение к значению типа указателя.

GMEM_MOVEABUE

Распределяет перемещаемую память. Не может быть объединен с флажком GMEM_FIXED. Возвращаемое значение — дескриптор объекта памяти. Этот дескриптор представляет собой 32-разрядное значение, которое является приватным для вызывающего процесса. Для преобразования дескриптора в указатель применяется функция GtobalLock.

GMEM_ZERCMNrT

Инициализирует содержимое памяти, устанавливая его в 0.

GPTR

Комбинация флажков GMEM_FIXED и GMEM_ZEROINIT.

dw Bytes

DWORD. Число байтов, которое должно быть распределено.

Возвращаемое значение

HGLOBAL. В случае успешного выполнения — дескриптор распределенного объекта памяти; в ином случае — NULL.

Включаемый файл

winbase.h

См. также

GlobalLock, GlobalReAlloc, GlobalFree

Пример

В следующем примере показано распределение памяти для хранения строки с использованием функций GlobalAlloc и GlobalReAlloc. При первоначальном запуске приложения (когда происходит получение сообщения WM_CREATE) распределяется 27-символьный буфер (26 символов и нулевой признак конца). Функция GlobalAlloc в Windows 98 фактически распределяет 28 байтов. Строка хранится в блоке памяти. Эта строка, наряду с объемом распределенной памяти и состоянием памяти, отображается в клиентской области окна. Когда пользователь выбирает пункт меню Test!, блок памяти перераспределяется, чтобы освободить место еще для 26 символов. Эти дополнительные символы записываются в буфер и отображаются. На рис. 11.1 показан внешний вид окна после выбора пункта меню Test!. Обратите внимание, что дескриптор памяти не разблокирован и поддерживается только указатель на эту область памяти. Если нужен дескриптор памяти, применяется функция GlobalHandle. Такая практика не влечет за собой никаких неблагоприятных эффектов, поскольку системы Windows 2000 и Windows 98 работают в защищенном режиме и заблокированную память можно перемещать по мере необходимости, не меняя указатель памяти.

Параметры HAfem

HGLOBAL. Дескриптор глобального объекта памяти, возвращенного функцией GlobalAlloc или Global Re Alloc.

Возвращаемое значение

UINT. 32-разрядное значение, указывающее флажки распределения и число блокировок объекта памяти; в ином случае, если НМет — недопустимый глобальный дескриптор памяти, возвращается флажок GMEM_INVALID_HANDLE. Младший байт младшего слова содержит число блокировок. Для выборки числа блокировок применяется флажок GMEM_LOCKCOUNT с поразрядным оператором AND (&). Старший байт младшего слова указывает флажки распределения объекта памяти. В качестве этого параметра может быть указан 0 илрт флажок, приведенный в табл. 11.3

Таблица 11.3. Флажок возвращаемого значения GlobalFlags

Флажок

Описание

GMEM_DISCARDED

Память была отброшена.

Включаемый файл

winbase.h

См. также

GlobalAlloc, GlobalSize, GlobalLock

Пример

См. пример для функции GlobalAlloc.

GlobalFree   • Windows 98   • Windows 2000

Описание

Функция GlobalFree освобождает глобальный объект памяти и объявляет недействительным его дескриптор. Освобождение блока памяти влечет за собой возврат этой памяти системе для дальнейшего использования. Все блоки памяти, распределенные в приложении, должны быть освобождены перед завершением работы приложения в целях возврата памяти системе Windows. Каждому вызову функции GlobalAlloc в программе должен соответствовать вызов функции GlobalFree.

Синтаксис

HGLOBAL GlobalFree( HGLOBAL hMem )

Параметры НМет

HGLOBAL. Дескриптор глобального объекта памяти, возвращенного функцией GlobalAlloc или GlobalReAlloc.

Возвращаемое значение

HGLOBAL. В случае успешного выполнения возвращаемое значение — NULL; в ином случае возвращаемое значение — дескриптор глобального объекта памяти.

Включаемый файл

winbase.h

См. также

GlobalAlloc, GlobalDiscard, GlobalReAlloc

Пример

См. пример для функции GlobalAlloc.

GlobalHandle                            • Windows 98   • Windows 2000

Описание

Функция GlobalHandle выбирает дескриптор, связанный с заданным указателем на глобальный блок памяти. Если функция GlobalAlloc распределяет память с установленным флажком GMEM_MOVEABLE, она возвращает

дескриптор объекта памяти. Функция GlobalLock преобразует этот дескриптор в указатель на блок памяти, а функция GlobalHandle снова преобразует указатель в дескриптор. Если блоки памяти заблокированы, адрес не меняется, поэтому хранение только адреса блока, а не дескриптора является более эффективным. Для освобождения блока применяется функция GlobalHandle, позволяющая выбирать дескриптор по мере необходимости.

Синтаксис

HGLOBAL GlobalHandle( LPCVOID IpvMem )

Параметры

IpvMem

LPCVOID. Указатель на первый байт глобального блока памяти. Это — указатель, возвращаемый функцией GlobalLock.

Возвращаемое значение

HGLOBAL Дескриптор глобального блока памяти. Если функция не была выполнена успешно, возвращаемое значение — NULL.

Включаемый файл

winbase.h

См. также

GlobalFlags, GlobalLock, GlobalAlloc

Пример

См. пример для функции GlobalAlloc.

GlobalLock                              • Windows 98   • Windows 2000

Описание

Функция GlobalLock блокирует глобальный объект памяти и возвращает указатель на первый байт блока памяти объекта. Заблокированный блок памяти не может быть перемещен или отброшен. Для объектов памяти, распределенных с флажком GMEM_MOVEABLE, эта функция увеличивает число блокировок. Для получения указателя на глобальный объект памяти, распределенный с помощью функции GlobalAlloc или GlobalReAlloc с флажком GMEM_MOVEABLE, применяется функция GlobalLock. Указатель останется действительным до тех пор, пока блок не будет разблокирован с помощью функции GlobalUnlock.

Синтаксис

LPVOID GlobalLock( HGLOBAL hglbMem )

Параметры

hglbMem

HGLOBAL. Дескриптор глобального объекта памяти, возвращенного функцией GlobalAlloc или GlobalReAlloc.

Возвращаемое значение

LPVOID. В случае успешного выполнения — указатель на первый байт блока памяти; в ином случае — NULL.

Включаемый файл

winbase.h

См. также

GlobalUnlock, GlobalAlloc

Пример

См. пример для функции GlobalAlloc.

GlobalMemoryStatus                    • Windows 98   • Windows 2000

Описание

Функция GlobalMemoryStatus выбирает информацию о доступной в настоящее время памяти. Функция возвращает информацию и о физической, и о виртуальной памяти. Если общий объем памяти превышает 4 Гб, применяется функция GlobalMemoryStatusEx.

Функция GlobalMemoryStatus используется для определения объема памяти, который может быть распределен в приложении без заметных последствий для других приложений. Эта информация меняется от одного вызова к другому.

Синтаксис

VOID GlobalMemoryStatus( LPMEMORYSTATUS IpmstMemStat)

Параметры IpmstMemStat

LPMEMORYSTATUS. Указатель на структуру MEMORYSTATUS, в которой возвращается информация о текущем состоянии доступа к памяти. Перед вызовом этой функции должно быть установлено значение члена dwLength. См. приведенное ниже определение структуры MEMORYSTATUS.

Включаемый файл

winbase.h

См. также

GlobalMemoryStatusEx, GlobalAlloc, VirtualAlloc

Определение MEMORYSTATUS

typedef struct    MEMORYSTATUS{

DWORD dwLength;                //   sizeof (MEMORYSTATUS)

DWORD dwMemoryLoad;        //   Процент  используемой  памяти

DWORD dwTotalPhys ;             //  Объем  физической  памяти  в   байтах

DWORD dwAvailPhys;          //   Объем  физической  свободной памяти  в   байтах

DWORD dwTotalPageFile ;   //   Объем  файла  подкачки  в  байтах

DWORD dwAvailPageFile ;    //  Объем  свободного  пространства    файле  подкачки  в   байтах

DWORD dwTotal Virtual ;       //   Объем  адресного  пространства пользователя в  байтах

DWORD dwAvailVir tual ;       //   Объем   свободного   пространства пользователя  в   байтах

}   MEMORYSTATUS,   «LPMEMORYSTATUS ;

Члены dwLength

DWORD. Размер структуры. Вызывающий процесс должен установить этот член до вызова функции GlobalMemoryStatus.

dwMemoryLoad

DWORD. Текущее состояние использования памяти. Это — число от 0 до 100; здесь 0 обозначает полное отсутствие загрузки памяти, а 100 представляет полную загрузку памяти.

dwTotalPhys

DWORD. Общее число байтов физической памяти.

dwAvailPhys

DWORD. Число байтов доступной физической памяти.

dwTotalPageFile

DWORD. Общее число байтов, которое может храниться в файле подкачки. Этот параметр не представляет фактический размер файла подкачки на диске.

dwAvailPageFile

DWORD. Число байтов, доступных в файле подкачки.

dwTotalVirtual

DWORD. Общее число байтов виртуальной памяти, доступной вызывающему процессу.

dwAvailVirtual

DWORD. Число незарезервированных и невыделенных байтов виртуальной памяти.

Пример

В следующем примере, показанном на рис. 11.2, происходит выборка и отображение состояния памяти, когда пользователь выбирает опцию меню Test!.