Уроки Iczelion'а



         

Урок 12. Память и файлы


Мы выучим основы менеджмента памяти и файловых операций ввода/вывода в этом Урок е. Также мы используем обычные диалоговые окна как устройства ввода/вывода.

Скачайте пример здесь.

Теория:

Менеджмент памяти под Win32 с точки зрения приложения достаточно прост и прямолинеен. Используемая модель памяти называется плоской моделью памяти. В этой модели все сегментные регистры (или селекторы) указывают на один и тот же стартовый адрес и смещение 32-битное, так что приложение может обратиться к любой точке памяти своего адресного пространства без необходимости изменять значения селекторов. Это очень упрощает управление памятью. Больше нет "дальних" и "ближних" указателей.

Под Win16 существует две основные категории функций API памяти: глобальные и локальные. Функции глобального типа взаимодействуют с памятью в других сегментах, поэтому они функции "дальней" памяти. Функции локального типа взаимодействуют с локальной кучей процессов, поэтому они функции "ближней" памяти.

Под Win32 оба этих типа идентичны. Используете ли вы GlobalAlloc или LocalAlloc, вы получите одинаковый результат.

  1. Выделите блок памяти с помощью вызова GlobalAlloc. Эта функция возвращает хэндл на запрошенный блок памяти.
  2. "Закройте" блок памяти, вызвав GlobalLock. Эта функция принимает хэндл на блок памяти и возвращает указатель на блок памяти.
  3. Вы можете использовать указатель, чтобы читать или писать в память.
  4. "Откройте" блок памяти с помощью вызова GlobalUnlock. Эта функция возвращает указатель на блок памяти.
  5. Освободите блок памяти с помощью GlobalFree. Эта функции принимает хэндл на блок памяти.

Вы также можете заменить "Global" на "Local", т.е. LocalAlloc, LocalLock и т.д.

Вышеуказанный метод может быть упрощен использованием флага GMEM_FIXED при вызове GlobalAlloc. Если вы используете этот флаг, возвращаемое значение от Global/LocalAlloc будет указателем на зарезервированный блок памяти, а не хэндл этого блока. Вам не надо будет вызывать Global/LocakLock вы сможете передать указатель Global/LocalFree без предварительного вызова Global/LocalUnlock. Hо в этом туториале я использую "традиционный" подход, так как вы можете столкнуться с ним при изучении исходников других программ.




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