Ассемблер для Windows



         

Управление памятью - часть 2


Возможен и еще более экзотический подход с использованием флага GMEM_DISCARDABLE. Этот флаг используется совместно с GMEM_MOVEABLE. В этом случае блок может быть удален из памяти системой, если только вы его предварительно не зафиксировали. Если блок был удален системой, то функция GlobalLock возвратит 0, и Вам придется снова выделять блок и загружать, если необходимо, данные.

Для удаления блока памяти используется функция GlobalFree. Причем в случае выделения фиксированного блока памяти, аргументом функции является адрес блока памяти, а в случае перемещаемого блока памяти - дескриптор. Для освобождения удаляемого блока памяти используйте функцию GlobalDiscard.

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

MEM STRUC dwLength DW ? dwMemoryLoad DW ? dwTotalPhys DW ? dwAvailPhys DW ? dwTotalPageFile DW ? dwAvailPageFile DW ? dwTotalVirtual DW ? dwAvailVirtual DW ? MEM ENDS

dwLength - размер структуры в байтах.

dwMemoryLoad - процент использованной памяти.

dwTotalPhys - полный объем физической памяти в байтах.

dwAvailPhys - объем доступной физической памяти в байтах.

dwTotalPageFile - количество сохраненных байт физической памяти на диске.

dwAvailPageFile - количество доступных байт памяти, сохраненных на диске.

dwTotalVirtual - объем виртуальной памяти.

dwAvailVirtual - объем доступной виртуальной памяти.

Ниже на Рисунок 3.6.4 показано простейшее применение функции GlobalAlloc.

; файл MEM.ASM .386P ; плоская модель .MODEL FLAT, stdcall

; константы ; для вывода в консоль STD_OUTPUT_HANDLE equ -11 GENERIC_READ equ 80000000h OPEN_EXISTING equ 3 IFDEF MASM ; MASM ; прототипы внешних процедур EXTERN GlobalFree@4:NEAR EXTERN GlobalAlloc@8:NEAR EXTERN GetFileSize@8:NEAR EXTERN CloseHandle@4:NEAR EXTERN CreateFileA@28:NEAR EXTERN ReadFile@20:NEAR EXTERN GetStdHandle@4:NEAR EXTERN WriteConsoleA@20:NEAR EXTERN ExitProcess@4:NEAR EXTERN GetCommandLineA@0:NEAR ; директивы компоновщику для подключения библиотек includelib c:\masm32\lib\user32.lib includelib c:\masm32\lib\kernel32.lib ELSE ; TASM LOCALS ; прототипы внешних процедур EXTERN GlobalFree:NEAR EXTERN GlobalAlloc:NEAR EXTERN GetFileSize:NEAR EXTERN CloseHandle:NEAR EXTERN CreateFileA:NEAR EXTERN ReadFile:NEAR EXTERN GetStdHandle:NEAR EXTERN WriteConsoleA:NEAR EXTERN ExitProcess:NEAR EXTERN GetCommandLineA:NEAR




Содержание  Назад  Вперед