HeapWalk

Функция 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

Смотри также:

  • виртуальная память,
  • работа с кучей,
  • описание кучи,
  • список функций для работы с кучей,
  • HeapAlloc,
  • HeapReAlloc,
  • HeapFree,
  • HeapLock,
  • HeapUnlock,
  • HeapValidate,
  • TProcessHeapEntry
  • НазадHeapValidate Список записейВперед

    © Mystic, 2002