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

GlobalMemoryStatusEx                 • Windows 98   • Windows 2000

Описание

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

Синтаксис

BOOL GlobalMemoryStatusEx( LPMEMORYSTATUSEX IpmstMemStat )

Параметры IpmstMemStat

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

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

winbase.h

См. также

GlobalAlloc, VirtualAlloc

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

typedef struct    MEMORYSTATOS{

DWORD dwLength;

DWORD dwMemoryLoad;

DWORDLONG ullTotalPhys ;

DWORDLONG ullAvailPhys;

DWORDLONG ullTotalPageFile;

DWORDLONG ullAvailPageFile ;

DWORDLONG ullTotalVirtual ;

DWORDLONG ullAvailVirtual ;

DWORDLONG ullAvailExtendedVirtual ; }   MEMORYSTATUSEX,   *LPMEMORYSTATUSEX ;

Члены dwLength

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

dwMemoryLoad

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

ullTotalPhys

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

ullAvailPhys

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

ullTotalPageFile

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

ullAvailPageFile

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

ullTotalVlrtual

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

ullAvailVlrtual

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

ullAvailExtendedVirtual

DWORDLONG. Размер в байтах незарезервированной и невыделенной памяти в расширенной части виртуального адресного пространства вызывающего процесса.

GlobalReAlloc                           • Windows 98   • Windows 2000

Описание

Функция GlobalReAlloc позволяет менять размер или атрибуты глобального объекта памяти. Размер объекта может увеличиваться или уменьшаться в соответствии с изменяющимися потребностями приложения.

Синтаксис

HGLOBAL GlobalReAlloc( HGLOBAL hMem, DWORD dwBytes, UINT u Flags )

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

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

dw Bytes

DWORD. Новый размер блока памяти в байтах. Если этот параметр равен 0 и параметр uflags указывает флажок GMEM_MOVEABLE, возвращается дескриптор объекта памяти, отмеченного, как отброшенный. Если параметр uFlags указывает флажок GMEM_MODIFY, этот параметр игнорируется.

uflegt

UINT. Определяет перераспределение глобального объекта памяти. Флажок GMEMJMODIFY может быть объединен с флажком, приведенным в табл. 11.4.

Таблица 1 1.4. Значение флажка, применяемого с флажком GMEM_MODIFY параметра uFlag функции GlobalReAlloc

Флажок GMEM_MOVEABLE

ОписаниеПреобразовать неподвижный объект памяти в перемещаемый объект памяти.

Если в этом параметре не указан флажок GMEM_MODIFY, он может представлять собой любую комбинацию флажков, перечисленных в табл. 11.5.

Таблица 1 1.5. Значения параметра uFlags функции GlobalReAlloc

Флажок

Описание

GMEM_MOVEABLE

Распределить перемещаемую память. Если параметр dwByfes равен 0, вызов этой функции приводит к отбрасыванию блока памяти, который перед этим был перемещаемым и отбрасываемым. Если число блокировок объекта не равно нулю или блок памяти не является перемещаемым и отбрасываемым, функция не может быть завершена успешно. Если параметр dwBytes отличен от нуля, система получает разрешение переместить перераспределенный блок в новое место, не меняя атрибута "перемещаемый" или "неподвижный" объекта памяти.

Флажок

Описание

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

GMEM_ZERCHNIT

Инициализировать вновь выделяемую память нулями, если размер объекта памяти возрастает.

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

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

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

winbase.h

См. также

GlobalAlloc, GlobalDiscard, GlobalFree

Пример

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

GlobalSize                                •  Windows 98   • Windows 2000

Описание

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

Синтаксис

DWORD GlobalSize( HGLOBAL hMem )

Параметры hMem

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

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

DWORD. Размер глобального блока памяти в байтах. Если параметр hMem не представляет собой допустимый дескриптор памяти или объект был отброшен, возвращаемое значение — 0.

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

winbase.h

См. также

GlobalFlags, GlobalAlloc, GlobalHandle, GlobalReAlloc

Пример

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

GlobalUnlock                             • Windows 98   • Windows 2000

Описание

Функция GlobalUnlock позволяет разблокировать глобальный объект памяти. При каждом вызове в приложении функции GlobalLock для объекта памяти число его блокировок увеличивается. 'Функция   GlobalUnlock уменьшает число блокировок объекта памяти, который был распределен с флажком GMEM_MOVEABLE. Функция GlobalUnlock не воздействует на объекты памяти, распределенные с флажком GMEM FIXED. Прежде чем память может быть перемещена или отброшена системой Windows, функция GlobalUnlock должна быть вызвана столько же раз, сколько и функция GlobalLock.

Синтаксис

BOOL GlobalUnlock( HGLOBAL hMem )

Параметры hMem

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

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

BOOL. Если объект памяти после уменьшения числа блокировок все еще заблокирован, возвращаемое значение — TRUE; в ином случае возвращаемое значение — FALSE.

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

winbase.h

См. также

GlobalLock, GlobalAlloc, Global ReAlloc, Global Free

Пример

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

НеарАНос                                         • Windows 98   • Windows 2000

Описание

Функция HeapAlloc распределяет блок памяти из кучи. Распределенная память не является перемещаемой.

Синтаксис

LPVOID НеарА11ос( HANDLE hHeap, DWORD dwHags, DWORD dwBytes)

Параметры

hHeap

HANDLE. Дескриптор кучи, в которой должна быть распределена память. Это — дескриптор, возвращенный функцией HeapCreate или GetProcessHeap.

dwFlags

DWORD. Определяет способ распределения памяти. Флажки, указанные в качестве этого параметра, отменяют соответствующий флажок, указанный при создании кучи с применением HeapCreate. В качестве этого параметра можно указать один или несколько флажков, перечисленных в табл. 11.6.

Таблица 1 1.6. Значения параметра dwFlags функции HeapAlloc

Флажок

Описание

HEAP_GENERATE_EXCEPTIONS

В качестве указания на ошибку активизировать исключение, вместо возврата значения NULL.

HEAP_NO_SERIAUZE

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

HEAP_ZERO_MEMORY

Инициализировать распределенную память значениями 0.

dw Bytes

DWORD. Число байтов, которое должно быть распределено. Если куча, указанная параметром, hHeap имеет постоянный максимальный размер, то параметр dwBytes не должен превышать Ox0007FFF8.

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

LPVOID. В случае успешного выполнения, возвращаемое значение — указатель на распределенный блок памяти. Возвращаемое значение — NULL, если попытка распределения потерпела неудачу из-за недостатка доступной памяти или повреждения кучи. Если функция терпит неудачу и был указан флажок HEAP_GENERATE_EXCEPTIONS, могут быть выработаны значения исключений, перечисленные в табл. 11.7.

Таблица 11.7. Исключения, связанные с возникновением ошибок при выполнении функции HeapAlloc

Значение

Описание

STATUS_ACCESS_VIOLATION

Во время выполнения попытки распределения произошло нарушение правил доступа.

STATUS_NO_MEMORY

Попытка распределения была неудачной из-за недостатка доступной памяти.

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

winbase.h

См. также

GetProcessHeap, HeapCreate, HeapDestroy, HeapFree, HeapReAlloc, HeapSize, HeapCompact

Пример

В следующем примере во время запуска приложения создается куча с помощью функции HeapCreate. Затем память распределяется и используется в качестве динамического массива строк. Когда пользователь выбирает пункт меню Allocate!, из кучи распределяется память для хранения новой строки и к массиву добавляется указатель на эту память. Если в массиве не остается места, применяется функция HeapReAlloc для расширения массива. Когда пользователь выбирает пункт меню Free!, освобождается последняя распределенная строка. После того как освобождается достаточно строк для того, чтобы остался значительный объем неиспользуемого пространства, массив перераспределяется в целях его сжатия. При каждом перераспределении   массива   куча  уплотняется   с   помощью   функции HeapCompact.

См.    \local-sources\chapll\ll-04.txt

MapUserPhysicalPages                  • Windows 98   • Windows 2000

Описание

Функция  MapUserPhysicalPages отображает страницы распределенной физической памяти в указанные адреса, которые принадлежат к виртуальным адресам AWE.

Синтаксис

BOOL MapUserPhysicalPages( PVOID IpAddress, ULONG_PTR pNumberOfPages, PULONG_PTR pUserPfnArray )

Параметры IpAddress

PVOID. Указатель на начальный адрес области памяти, для которой должно быть выполнено повторное отображение. Значение этого параметра должно находиться в пределах диапазона адресов, возвращенных функцией VirtualAlloc при распределении области AWE.

р Number OfPagei

rULONG_PTR. Указывает размер в страницах физической памяти, для которой должно быть выполнено преобразование. Диапазон виртуальных адресов является непрерывным, начиная с IpAddress.

р User PfnAr ray

PULONG_PTR Адрес массива номеров физических страничных блоков. Эти страничные блоки будут отображены параметром IpAddress после возврата из функции. Если в качестве этого параметра применяется значение NULL, указанный диапазон адресов не будет отображен.

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

BOOL. В случае успешного выполнения возвращаемое значение — TRUE; в ином случае возвращаемое значение — FALSE. Для выборки расширенных данных об ошибке применяется функция GetLastError.

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

winbase.h

См. также

MapUserPhysicalPagesScatter, AllocateUserPhysicalPages

MapUserPhysicalPagesScatter           + Windows 98   *  Windows 2000

Описание

Функция MapUserPhysicalPagesScatter отображает страницы распределенной физической памяти, которые принадлежат к виртуальным адресам AWE. В отличие от MapUserPhysicalPages, функция MapUserPhysicalPagesScatter позволяет отображать и отменять отображение нескольких областей.

Синтаксис

BOOL MapUserPhysicalPagesScatter( PVOID* IpVirtualAddresses, ULONG_PTR p Number Of Pages, PULONG_PTR pUserPfnArray )

Параметры Ip VirtualAddresses

PVOID*. Указатель на массив начальных адресов областей памяти, для которых должно быть выполнено повторное отображение. Каждый вход должен находиться в пределах диапазона адресов, возвращенных функцией VirtualAHoc при распределении области AWE. Значение, приведенное в качестве параметра р Number Of Pages, указывает размер массива.

рNumberOfPages

ULONG_PTR. Указывает размер в страницах физической памяти, для которой должно быть выполнено преобразование. Диапазон виртуальных адресов указан массивом IpVirtualAddresses.

pUserPfnArray

PULONG_PTR. Адрес массива номеров физических страничных блоков. Эти страничные блоки будут отображены параметром  IpAddress после возврата из этой функции. Если в качестве этого параметра применяется значение NULL, указанный диапазон адресов не будет отображен.

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

BOOL. В случае успешного выполнения возвращаемое значение — TRUE; в ином случае возвращаемое значение — FALSE. Для выборки расширенных данных об ошибке применяется функция GetLastError.

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

winbase.h

См. также

MapUserPhysicalPages, AllocateUserPhysicalPages

HeapCompact                             •  Windows 98   •  Windows 2000

Описание

Функция HeapCompact пытается уплотнить указанную кучу. Она уплот няет кучу, сливая смежные свободные блоки памяти и отменяя выделе ние больших свободных блоков памяти. Нет гарантии, что приложени сможет успешно распределить блок памяти с размером, возвращенным функцией HeapCompact. Такому распределению могут воспрепятствовать другие нити или установленный порог выделения.

Синтаксис

UINT HeapCompact( HANDLE hHeap, DWORD dwFlags )

Параметры hHeap

HANDLE. Дескриптор кучи, которую будет пытаться уплотнить эта функция.

dwFlags    

DWORD. Должен быть установлен равным HEAP_NO_SERIALIZE, если необходимо исключить сериализацию (преобразование в последовательную форму) доступа к куче на время обращения к ней функции. Если этот

параметр установлен в 0, в процессе уплотнения кучи происходит сериа-лизация доступа к ней. Это — безопасное и простое условие, заданное по умолчанию.

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

UINT. В случае успешного выполнения возвращаемое значение представляет собой размер в байтах самого большого выделенного свободного блока в куче; в ином случае возвращаемое значение равно 0. Для выборки расширенных данных об ошибке применяется функция GetLastError.

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

winbase.h

См. также

HeapCreate

Пример

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

HeapCreate                               • Windows 98   • Windows 2000

Описание

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

Синтаксис

HANDLE HeapCreate( DWORD dwOptions, DWORD dwInitialSize, DWORD dwMaximumSize )

Параметры dw Options

DWORD. Необязательные атрибуты для новой кучи. Эти опции воздействуют на последующий доступ к новой куче путем вызова функций кучи (HeapAlloc, HeapFree, HeapReAlloc и HeapSize). В качестве этого параметра можно указать один или несколько флажков, перечисленных в табл. 11.8.

Таблица 11.8. Значения параметра dwOptions функции HeapCreate

Флажок

Описание

HEAP _GENERATE_EXCEPT1ONS

В качестве указания на ошибку активизирует исключение, вместо возврата значения NULL.

HEAP_NO_SERIALIZE

Взаимоисключающая блокировка не будет применяться в то время, как функции кучи распределяют и освобождают память из этой кучи. Если этот параметр не указан, происходит сериализация доступа к куче. Сериализация доступа к куче позволяет двум или более нитям одновременно распределять и освобождать память в одной и той же куче.

dwInitialSize

DWORD. Начальный размер кучи в байтах. Этот параметр определяет начальный объем физической памяти, которая распределена для кучи, округленный в большую сторону до границы следующей страницы. Для определения размеров страницы на хост-компьютере применяется функция GetSystemlnfo.

dwMaximumSize

DWORD. Максимальный размер кучи в байтах. Если в качестве значения этого параметра установлен 0, максимальный размер кучи ограничен только объемом доступной памяти. Если параметр dwMaximumSize отличен от нуля, размер определяется как число байтов, указанное параметром dwMaxi-mumSize, с округлением в большую сторону до границы следующей страницы. Блок такого размера резервируется в виртуальном адресном пространстве процесса.Если куча имеет постоянный максимальный размер, то отдельные запросы на распределение, выполненные с помощью функций HeapAlIoc или HeapReAlloc, не должны превышать Ox7FFF8 байтов; запросы на распределение более крупных блоков завершаются неудачно, даже если максимальный размер кучи достаточно велик для того, чтобы можно быть выделить подобный блок. Если запросы распределения превышают начальный объем физической памяти, указанный параметром dwInitialSize, система распределяет для кучи дополнительные страницы физической памяти, вплоть до максимального размера кучи.

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

HANDLE. Дескриптор вновь созданной кучи. Если возникает ошибка, возвращаемое значение — NULL.

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

winbase.h

См. также

HeapFree, HeapAlIoc, HeapReAlloc, HeapDestroy

Пример

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

HeapDestroy                             • Windows 98   • Windows 2000

Описание

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

Синтаксис

BOOL HeapDestroy( HANDLE hHeap )

Параметры hHeap

HANDLE. Дескриптор кучи, которая должна быть уничтожена. Этот параметр должен представлять собой дескриптор, возвращенный функцией HeapCreate. Дескрипторы, возвращенные функцией GetProcessHeap, не должны использоваться.

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

BOOL. В случае успешного выполнения возвращаемое значение — TRUE; в ином случае возвращаемое значение — FALSE.

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

winbase.h

См. также

HeapFree, HeapCreate

Пример

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

HeapFree                                • Windows 98   • Windows 2000

Описание

Функция HeapFree освобождает блок памяти, распределенный из кучи с помощью функции HeapAlIoc или HeapReAlloc.

Синтаксис

BOOL HeapFree( HANDLE hHeap, DWORD dwfJags, LPVOID IpMem )

Параметры hHeap

HANDLE. Дескриптор кучи, возвращенный функцией HeapCreate или GetProcessHeap.

dwFlags

DWORD. Если этот параметр установлен равным HEAP_NO_SERIALIZE,сериализация доступа к кучи не выполняется. Это означает, что монопольный доступ не обеспечивается и не должен применяться, если куча разделена между нитями. Определение этого флажка приводит к отмене опций, установленных при создании кучи с помощью функции HeapCreate.

lpMet

LPVOID. Указатель на блок памяти, которая должна быть освобождена, возвращенный функцией HeapAlIoc или HeapReAlloc.

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

BOOL. В случае успешного выполнения возвращаемое значение — TRUE; в ином случае возвращаемое значение — FALSE.

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

winbase.h

См. также

HeapCreate, HeapAlloc, HeapReAlloc, HeapDestroy

Пример

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

HeapReAlloc                              • Windows 98   • Windows 2000

Описание

Функция HeapReAlloc выполняет повторное распределение блока памяти из кучи. Полученный блок памяти не является перемещаемым.

Синтаксис

LPVOID HeapReAlloc( HANDLE hHeap, DWORD dwFlags, LPVOID IpMem, DWORD dwBytes )

Параметры hHeap

HANDLE. Дескриптор кучи, возвращенный функцией HeapCreate или GetProcessHeap.

dwFlags

DWORD. Определяет способ перераспределения памяти. Флажки, указанные в качестве этого параметра, отменяют соответствующий флажок, указанный при создании кучи с применением функции HeapCreate. В качестве этого параметра можно указать один или несколько флажков, перечисленных в табл. 11.9.

IpMem.

LPVOID. Указатель на блок памяти, перераспределяемый функцией, который возвращен при предыдущем вызове функции HeapAlloc или HeapReAlloc.

dwBytes

DWORD. Число байтов, которое должно быть распределено. Если куча, указанная параметром hHeap, имеет постоянный максимальный размер, параметр dwBytes не должен превышать Ox7FFF8.

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

LPVOID. В случае успешного выполнения возвращаемое значение — указатель на перераспределенный блок памяти. Возвращаемое значение — NULL, если попытка распределения неудачна из-за недостатка доступной памяти или повреждения кучи.Если функция терпит неудачу и был указан флажок HEAP_GENERATE_EXCEPTIONS, могут быть выработаны значения исключений, перечисленные в табл. 11.10.

Таблица 11.9. Флажки функции HeapReAlloc

Флажок

Описание

HEAP_GENERATE_EXCEPTIONS

В качестве указания на ошибку активизировать исключение, вместо возврата значения NULL.

HEAP_NO_SERIALIZE

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

HEAPJREAUOCJN_PLACE_ONLY

Не должно быть никакого перемещения при перераспределении блока памяти большего размера. Если этот флажок не указан и запрос на перераспределение требует выделения блока памяти большего размера, функция может переместить блок в новое место. Если же этот флажок указан и блок не может быть расширен без перемещения, функция не может быть выполнена.

HEAP_ZERO_MEMORY

Если происходит расширение блока, инициализировать вновь распределенную память значениями 0.

Таблица 1 1. 10. Исключения, связанные с возникновением ошибок при выполнении функции HeapReAlloc

Значение

Описание

STATUS_ACCESS_VIOLATION

При попытке перераспределения произошло нарушение правил доступа.

STATUS_NO_MEMORY

Перераспределение не выполнено из-за отсутствия доступной памяти.

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

winbase.h

См. также

HeapCreate, HeapAlloc, GetProcessHeap

Пример

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

HeapSize                                  • Windows 98   • Windows 2000

Описание

Функция HeapSize возвращает размер в байтах блока памяти, распределенного из кучи с помощью функции HeapAlloc или HeapReAlloc.

Синтаксис

DWORD HeapSize( HANDLE hHeap, DWORD dwFJags, LPCVOID IpMem )

Параметры hHeap

HANDLE. Дескриптор кучи, в которой находится блок памяти. Этот дескриптор должен быть возвращен функцией HeapCreate или GetProcessHeap.

dw Flags

DWORD. Если этот параметр установлен равным HEAP_NO_SERIALIZE,сериализация доступа к куче не выполняется. Это означает, что монопольный доступ не обеспечивается и не должен применяться, если куча разделена между нитями. Определение этого флажка приводит к отмене опций, установленных при создании кучи с помощью функции HeapCreate.

lp Mem

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

Возвращаемое значение DWORD. Размер распределенного блока памяти в байтах.

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

winbase.h

См. также

HeapCreate, GetProcessHeap, HeapAlloc, HeapReAlloc

Пример

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

См.    \local-sources\chapll \11-05. txt

IsBadCodePtr                            + Windows 98   + Windows 2000

Описание

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

Синтаксис

BOOL IsBadCodePtr( FARPROC IpfnProc )

Параметры

IpfnProc

FARPROC. Указатель на адрес в памяти.

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

BOOL. FALSE, если вызывающий процесс имеет доступ для чтения к указанной памяти; в ином случае возвращаемое значение — TRUE.

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

winbase.h

См. также

IsBadReadPtr, IsBadStringPtr, IsBadWritePtr

Пример

В следующим примере показано, как вызвать в приложении функцию с минимальным риском выработки сообщения о нарушении защиты.

См.    \local-sources\chapll\ll-06.txt

IsBadReadPtr                            * Windows 98   * Windows 2000

Описание

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

Синтаксис

BOOL IsBadReadPtr( CONST VOID* IpvPtr, UINT cbBytes )

Параметры IpvPtr

CONST VOID*. Указатель на первый байт блока памяти.

cbBytes

UINT. Размер блока памяти в байтах.

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

BOOL. FALSE, если вызывающий процесс имеет доступ для чтения ко всем байтам в указанном диапазоне адресов памяти; в ином случае, возвращаемое значение — TRUE.

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

winbase.h

См. также

IsBadCodePtr, IsBadStringPtr, IsBadWritePtr

Пример

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

IsBadStringPtr                           • Windows 98   • Windows 2000

Описание

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

Синтаксис

BOOL IsBadStringPtr( LPCTSTR IpszStr, UINT cchMax )

Параметры

IpszStr

LPCTSTR. Указатель на строку с нулевым символом в конце, представленную в коде Unicode или ASCII.

cchMax

UINT. Максимальный размер строки в символах.

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

BOOL. FALSE, если вызывающий процесс имеет доступ для чтения ко всем байтам вплоть до завершающего нулевого символа строки или к числу байтов, указанных параметром cchMax; в ином случае возвращаемое зна- ; чение — TRUE.

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

winbase.h

См. также

IsBadCodePtr, IsBadReadPtr, IsBadWritePtr

Пример

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

IsBadWritePtr                            • Windows 98   • Windows 2000

Описание

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

Синтаксис

BOOL IsBadWritePtr( LPVOID IpvPtr, UINT cbBytes )

Параметры

IpvPtr

LPVOID. Указатель на первый байт блока памяти.

cbBytes

UINT. Размер блока памяти в байтах.

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

BOOL. FALSE, если вызывающий процесс имеет доступ для записи ко всем байтам в указанном диапазоне адресов памяти; в ином случае возвращаемое значение — TRUE.

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

winbase.h

См. также

IsBadCodePtr, IsBadReadPtr, IsBadStringPtr

Пример

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

MoveMemory                           • Windows 98   • Windows 2000

Описание

Функция MoveMemory перемещает блок памяти из одного места в другое.

Синтаксис

VOID MoveMemory( PVOID pDestination, CONST VOID* pSource, SIZE_T Length )

Параметры

рDestination

PVOID. Указатель на начальный адрес назначения сдвига.

pSource

CONST VOID*. Указатель на начальный адрес блока памяти, который должен быть перемещен.

Length

SIZE Т. Указывает размер в байтах блока памяти, который должен быть перемещен.

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

winbase.h

См. также

FillMemory, CopyMemory, ZeroMemory

MulDiv                                   • Windows 98   • Windows 2000

Описание

Функция MulDiv умножает два 32-разрядных значения (nMultiplicand* nMultiplier), а затем делит 64-разрядный результат на третье 32-разрядное значение (nDivisor). Возвращаемое значение округляется с увеличением или уменьшением до ближайшего целого числа. Функция MulDiv применяется для вычислений, при которых результат умножения может выйти за пределы 32-разрядного представления чисел.

Синтаксис

int MulDiv( int nMultiplicand, int nMultiplier, int nDivisor )

Параметры nMultiplicand

int. Множимое.

nMultiplier

int. Множитель.

nDivisor

int. Число, на которое должен быть разделен результат умножения (nMultiplicand* nMultiplier) .

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

int. Результат умножения и деления. Если произошло переполнение или параметр nDivisor был равен 0, возвращаемое значение равно

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

winbase.h

Пример

В  следующем  примере  (рис.   11.3)  показано  вычисление  выражения (200000*300000) / 100000. При вычислении с использованием только целых чисел промежуточное значение превысило бы по размерам 32-разрядное представление. Применение функции  MulDiv позволяет получ.ить правильный результат.