Функция HeapWalk перечисляет фрагменты памяти, содержащиеся в указанной куче, которые были созданы или изменены при помощи функций HeapAlloc, HeapReAlloc и HeapFree.
function HeapWalk( hHeap: THandle; // дескриптор кучи var lpEntry: TProcessHeapEntry // информация о состоянии фрагмента памяти ): BOOL; stdcall;
Параметры
hHeap [in]
Дескриптор кучи, фрагменты памяти которой мы хотим перечислить.
lpEntry [in/out]
Переменая типа TProcessHeapEntry, которое
содержит состояние очередного фрагмента памяти при перечислении кучи.
При удачном завершении функция HeapWalk возвращает значение True, и в переменной lpEntry содержиться описание очередного фрагмента памяти.
Для того, чтобы проинициализировать структуру lpEntry при первом обращении к функии HeapWalk, или для того, чтобы пересмотреть всю кучу сначала, необходимо установить полу lpData структуры в nil. Для того, чтобы продолжить перечисление и получить описание слудующего фрагмента памяти, необходимо выполнить повторный вызов функции HeapWalk не внося никаких изменений в переменные hHeap, lpEntry, ни в какие-либо поля структуры lpEntry.
Возвращаемое значение
В случае удачного завершения функция возвращает True.
В случае ошибки функция вернет False. Для получения расширенной информации об ошибке следует сделать вызов GetLastError.
Если перечисление всех фрагментов памяти, содержащихся в куче, прошло успешно, и был достигнут конец кучи, функция вернет False, а вызов GetLastError вернет значение кода ошибки ERROR_NO_MORE_ITEMS.
Описание
Для того, чтобы проинициализировать структуру lpEntry при первом обращении к функии HeapWalk, или для того, чтобы пересмотреть всю кучу сначала, необходимо установить поле lpData структуры в nil.
Для того, чтобы продолжить перечисление и получить описание слудующего фрагмента памяти, необходимо выполнить повторный вызов функции HeapWalk не внося никаких изменений в переменные hHeap, lpEntry, ни в какие-либо поля структуры lpEntry. Чтобы получить полный список всех фрагментов памяти, которые содержатся в куче, необходимо повторять вызовы HeapWalk до тех пор, пока функция не вернет False. В этом случае, если функция GetLastError вернет значение ERROR_NO_MORE_ITEMS, то это значит, что все фрагменты памяти, принадлежащие указанной куче, были перечислены.
Не существует никакого специального вызова HeapWalk, либо какой-либо другой функции для того, чтобы прекратить перечисление фрагментов памяти. Вся информация, необходимая для того, чтобы продолжить перечисление, храниться в переменной lpEntry.
Выполнение функции HeapWalk может привести к сбою, если во время перечисления элементов к указанной куче обращались несколько потоков. Чтобы предотвратить это, необходимо использовать функцию HeapLock и HeapUnlock для того, чтобы на время перечисления фрагментов памяти блокировать доступ к куче из других потоков.
Прогулка по куче может потребовать серьезной затраты времени, особенно симметричных многопроессорных машинах (SMP).
Примечание: для того, чтобы уберечь себя от ошибки нарушения доступа (access violation), вы должны защитить блоками структурной обработки исключений любой код, выполняющий операции чтения/записи в кучу. Для большей информации по этому вопросу смотрите раздел "Структурная обработка исключений".
Требования
Windows NT/2000: Требуется Windows NT 3.5 или более поздняя версия
Windows 95/98: Не поддерживается
Бибиотека: Kernel32.dll
Подключаемый модуль: Windows
Смотри также:
HeapValidate |
Список записей![]() |
© Mystic, 2002