- •Часть I. Язык Borland Pascal Глава 1. Что такое программа Borland Pascal?
- •Программа Borland Pascal
- •Процедуры и функции
- •Операторы
- •Выражения
- •Лексемы
- •Типы, переменные, константы и типизированные константы
- •Компоновка частей
- •Синтаксические диаграммы
- •Глава 2.Лексемы
- •Специальные символы
- •Зарезервированные слова и стандартные директивы Borland Pascal
- •Идентификаторы
- •Строки символов
- •Комментарии
- •Строки программы
- •Глава 3. Константы
- •Глава 4. Типы
- •Простые типы
- •Порядковые типы
- •Целочисленные типы
- •Булевские типы
- •Символьный тип (char)
- •Перечислимые типы
- •Отрезки типа
- •Вещественные типы
- •Программная поддержка чисел с плавающей точкой
- •Аппаратная поддержка чисел с плавающей точкой
- •Строковые типы
- •Структурные типы
- •Типы массив
- •Типы запись
- •Объектные типы
- •Компоненты и область действия
- •Виртуальные методы
- •Динамические методы
- •Создание экземпляров объектов
- •Активизация методов
- •Активизация уточненных методов
- •Множественные типы
- •Файловые типы
- •Ссылочные типы
- •Тип Pointer
- •Тип pChar
- •Процедурные типы
- •Процедурные значения
- •Совместимость типов
- •Тождественные и совместимые типы
- •Тождественность типов
- •Совместимость типов
- •Совместимость по присваиванию
- •Раздел описания типов
- •Глава 5. Переменные и типизированные константы Описания переменных
- •Сегмент данных
- •Сегмент стека
- •Абсолютные переменные
- •Ссылки на переменные
- •Квалификаторы
- •Массивы, строки и индексы
- •Записи и десигнаторы полей
- •Десигнаторы компонентов объекта
- •Переменные-указатели и динамические переменные
- •Приведение типов переменных
- •Типизированные константы
- •Константы простого типа
- •Константы строкового типа
- •Константы структурного типа
- •Константы типа массив
- •Константы типа запись
- •Константы объектного типа
- •Константы множественного типа
- •Константы ссылочного типа
- •Константы процедурного типа
- •Глава 6. Выражения
- •Синтаксис выражений
- •Операции
- •Арифметические операции
- •Унарные арифметические операции
- •Логические операции
- •Булевские операции
- •Операция со строками
- •Операции над символьными указателями
- •Операции над множествами
- •Операции отношения
- •Сравнение простых типов
- •Сравнение строк
- •Сравнение упакованных строк
- •Сравнение указателей
- •Сравнение символьных указателей
- •Сравнение множеств
- •Проверка на принадлежность к множеству
- •Операция @
- •Использование операции @ для переменной
- •Использование операции @ для процедуры или функции или метода
- •Вызовы функции
- •Описатели множества
- •Приведение типа значений
- •Процедурные типы в выражениях
- •Глава 7. Операторы
- •Простые операторым
- •Оператор присваивания
- •Операторы процедуры
- •Операторы перехода
- •Структурные операторы
- •Составные операторы
- •Условные операторы
- •Оператор условия (if)
- •Оператор варианта (case)
- •Оператор цикла
- •Оператор цикла с постусловием (repeat)
- •Операторы цикла с предусловием (while)
- •Операторы цикла с параметром (for)
- •Оператор with
- •Глава 8. Блоки, локальность и область действия
- •Синтаксис
- •Правила для области действия
- •Область действия для блока
- •Область действия записи
- •Область действия объекта
- •Область действия модуля
- •Глава 9. Процедуры и функции
- •Описания near и far
- •Описания export
- •Описания interrupt
- •Описание forward
- •Описания external
- •Описания assembler
- •Описания inline
- •Описания функций
- •Описания методов
- •Конструкторы и деструкторы
- •Восстановление ошибок конструктора
- •Параметры
- •Параметры-значения
- •Параметры-константы
- •Параметры-переменные
- •Нетипизированные параметры
- •Открытые параметры
- •Открытые строковые параметры
- •Открытые параметры-массивы
- •Динамические переменные объектного типа
- •Процедурные переменные
- •Параметры процедурного типа
- •Глава 10. Программы и модули Синтаксис программ
- •Заголовок программы
- •Оператор uses
- •Синтаксис модулей
- •Заголовок модуля
- •Интерфейсная секция
- •Секция реализации
- •Секция инициализации
- •Косвенные ссылки на модули
- •Перекрестные ссылки на модули
- •Совместное использование описаний
- •Глава 11. Динамически компонуемые библиотеки
- •Что такое dll?
- •Использование dll
- •Модули импорта
- •Статический и динамический импорт
- •Написание dll
- •Директива процедуры export
- •Оператор exports
- •Код инициализации библиотеки
- •Замечания по программированию библиотек
- •Глобальные переменные в dll
- •Глобальные переменные и файлы в dll
- •Dll и модуль System
- •Ошибки этапа выполнения в dll
- •Dll и сегменты стека
- •Создание совместно используемых dll
- •Часть II. Глава 12. Библиотеки исполняющей системы
- •Модули Borland Pascal
- •Модуль System
- •Модуль Dos и WinDos
- •Модуль Crt
- •Модуль WinCrt
- •Модули Turbo3 и Graph3
- •Модули WinTypes и WinProcs
- •Модуль Win31
- •Модуль WinApi
- •Модули, поддерживающие Windows 3.1
- •Глава 13. Стандартные процедуры и функции
- •Процедуры управления работой программы
- •Функции преобразования
- •Арифметические функции
- •Порядковые процедуры и функции
- •Строковые процедуры и функции
- •Процедуры и функции динамического распределения памяти
- •Функции для работы с указателями и адресами
- •Прочие процедуры и функции
- •Предописанные переменные
- •Глава 14. Ввод и вывод
- •Файловый ввод-вывод
- •Текстовые файлы
- •Нетипизированные файлы
- •Переменная FileMode
- •Устройства в Borland Pascal
- •Устройства dos
- •Устройство cоn
- •Устройства lрt1, lрt2 и lрt3
- •Устройства cом1 и cом2
- •Устройство nul
- •Устройства, предназначенные для текстовых файлов
- •Ввод и вывод с помощью модуля Crt
- •Использование модуля crt
- •Окна crt
- •Специальные символы
- •Ввод строк
- •Процедуры и функции модуля Crt
- •Константы и переменные модуля Crt
- •Ввод и вывод с помощью модуля WinCrt
- •Использование модуля WinCrt
- •Специальные символы
- •Ввод строк
- •Процедуры и функции
- •Переменные модуля WinCrt
- •Печать из программы Windows
- •Изменение заголовков
- •Изменение шрифтов
- •Остановка задания печати
- •Специальные символы
- •Процедуры и функции модуля WinPrn
- •Функция Open
- •Функция InOut
- •Функция Flush
- •Функция Clоsе
- •Глава 15. Использование сопроцессора 80x87
- •Типы данных процессора 80x87
- •Арифметические операции с повышенной точностью
- •Сравнение вещественных чисел
- •Стек вычислений сопроцессора 80x87
- •Запись вещественных чисел при использовании сопроцессора 80x87
- •Модули, в которых используется сопроцессор 80x87
- •Распознавание сопроцессора 80х87 в программах dos
- •Распознавание сопроцессора 80x87 в программе Windows
- •Использование эмуляции сопроцессора 80x87 на языке ассемблера
- •Глава 16. Модуль Dоs
- •Процедуры и функции модуля Dos
- •Константы, типы и переменные модуля Dos
- •Переменные модуля Dos
- •Процедуры и функции модуля WinDos
- •Константы, типы и переменные модуля WinDos
- •Переменные модуля WinDos
- •Глава 17. Программирование в защищенном режиме dos
- •Что такое защищенный режим?
- •Расширения Borland защищенного режима dos
- •Dpmi-сервер
- •Администратор этапа выполнения
- •Разработка прикладных программ dos защищенного режима
- •Надежное программирование в защищенном режиме
- •Загрузка в сегментные регистры недопустимых значений
- •Функция Ptr и массивы Mem
- •Абсолютные переменные
- •Операции с сегментами
- •Использование сегментных регистров в качестве временных переменных
- •Доступ к памяти вне границ сегмента
- •Запись в сегмент кода
- •Разыменование указателей nil
- •Сегменты кода и данных
- •Управление динамически распределяемой памятью
- •Предопределенные селекторы
- •Переменная SelectorInc
- •Модуль WinApi
- •Управление памятью
- •Подпрограммы управления памятью api
- •Управление модулем
- •Управление ресурсами
- •Управление селектором
- •Другие подпрограммы api
- •Прямой доступ к dpmi-серверу
- •Компиляция прикладной программы защищенного режима
- •Выполнение программы защищенного режима dos
- •Управление объемом используемой rtm памяти
- •Глава 18. Строки с завершающим нулем
- •Что такое строка с завершающим нулем?
- •Функции модуля Strings
- •Использование строк с завершающим нулем
- •Символьные указатели и строковые литералы
- •Символьные указатели и символьные массивы
- •Индексирование символьного указателя
- •Операции с символьными указателями
- •Строки с завершающим нулем и стандартные процедуры
- •Пример использования функций с завершающим нулем
- •Глава 19. Использование графического интерфейса Borland
- •Драйверы
- •Поддержка устройства ibm 8514
- •Система координат
- •Текущий указатель
- •Графические изображения и их виды
- •Области просмотра и двоичные образы
- •Поддержка страниц и цветов
- •Обработка ошибок
- •Начало работы
- •Пользовательские программы управления динамически распределяемой памятью
- •Процедуры модуля Graph
- •Константы, типы и переменные модуля Graph
- •Константы
- •Переменные
- •Глава 20. Использование оверлеев
- •Администратор оверлеев
- •Управление оверлейным буфером
- •Процедуры и функции модуля Overlay
- •Коды результата
- •Разработка программ с оверлеями
- •Генерация оверлейного кода
- •Требование использования дальнего типа вызовов
- •Инициализация администратора оверлеев
- •Разделы инициализации в оверлейных модулях
- •Что не должно использоваться в качестве оверлеев
- •Отладка оверлеев
- •Внешние программы в оверлеях
- •Задание функции чтения оверлея
- •Оверлеи в файлах .Exe
- •Часть III. В среде Borland Pascal Глава 21. Использование памяти
- •Использование памяти программами реального режима dos
- •Администратор динамически распределяемой области памяти dos
- •Методы освобождения областей динамически распределяемой памяти
- •Список свободных блоков
- •Переменная HeapError
- •Использование памяти в программах dos защищенного режима
- •Сегменты кода
- •Атрибуты сегмента
- •Атрибуты moveable или fixed
- •Атрибуты preload или demandload
- •Атрибуты discardable или permament
- •Сегменты данных и стека
- •Изменение атрибутов
- •Администратор динамически распределяемой области памяти dos
- •Переменная HeapError
- •Использование памяти в программах Windows
- •Атрибуты сегментов
- •Атрибуты moveable или fixed
- •Атрибуты preload или demandload
- •Атрибуты discardable или permanent
- •Изменение атрибутов
- •Сегмент локальных динамических данных
- •Администратор динамически распределяемой области памяти
- •Переменная HeapError
- •Форматы внутреннего представления данных
- •Целочисленные типы
- •Символьный тип
- •Булевский тип
- •Перечислимый тип
- •Типы с плавающей точкой
- •Вещественный тип
- •Тип числа с одинарной точностью
- •Тип числа с двойной точностью
- •Тип числа с повышенной точностью
- •Сложный тип
- •Значения типа указатель
- •Значения строкового типа
- •Значения множественного типа
- •Значения типа массив
- •Значения типа запись
- •Объектные типы
- •Значения файлового типа
- •Процедурные типы
- •Прямой доступ к памяти
- •Прямой доступ к портам
- •Глава 22. Вопросы управления
- •Соглашения по вызовам
- •Параметры-переменные
- •Параметры-значения
- •Открытые строковые параметры
- •Результаты функций
- •Ближние и дальние типы вызовов
- •Вложенные процедуры и функции
- •Соглашения о вызовах методов
- •Вызовы виртуальных методов
- •Вызовы динамических методов
- •Конструкторы и деструкторы
- •Стандартный код входа и выхода
- •Соглашения по сохранению регистров
- •Процедуры выхода
- •Обработка прерываний
- •Разработка процедур обработки прерываний
- •Глава 23. Автоматическая оптимизация
- •Свертывание констант
- •Слияние констант
- •Вычисление по короткой схеме
- •Параметры-константы
- •Устранение избыточной загрузки указателей
- •Подстановка констант множественного типа
- •Малые множества
- •Порядок вычисления
- •Проверка на допустимость границ
- •Использование сдвига вместо умножения
- •Автоматическое выравнивание на границу слова
- •Удаление неиспользуемого кода
- •Эффективная компоновка
- •Часть IV. Использование Borland Pascal с языком ассемблера Глава 24. Встроенный ассемблер
- •Оператор asm
- •Использование регистров
- •Синтаксис операторa ассемблера
- •Размер инструкции ret
- •Автоматическое определение размера перехода
- •Директивы ассемблера
- •Операнды
- •Выражения
- •Различия между выражениями Паскаля и ассемблера
- •Элементы выражений
- •Константы
- •Числовые константы
- •Строковые константы
- •Регистры
- •Идентификаторы
- •Классы выражений
- •Типы выражений
- •Операции в выражениях
- •Процедуры и функции ассемблера
- •Глава 25. Компоновка с программами на языке ассемблера
- •Турбо Ассемблер и Borland Pascal
- •Примеры программ на языке ассемблера
- •Методы на языке ассемблера
- •Включаемый машинный код
- •Операторы Inline
- •Директивы inline
Модуль WinApi
Модуль WinAPI дает вам непосредственный доступ к расширениям
Borland защищенного режима DOS. Чтобы облегчить написание перено-
симых прикладных программ и совместимых на уровне двоичного кода
DLL, разработан интерфейс WinAPI, являющийся подмножеством интер-
фейса API Windows.
Модуль WinAPI позволяет вам использовать функции управления
памятью, управления ресурсами, модулями, селекторами и многие
другие функции API. Ниже приведено их краткое описание. Полное
описание констант, типов, процедур и функций модуля WinAPI вы мо-
жете найти в "Справочном руководстве программиста".
При работе под Windows подпрограммы API, поддерживаемые с
помощью модуля WinAPI, находятся в динамически компонуемых библи-
отеках KERNEL.DLL и USER.DLL. В защищенном режиме DOS эти DLL не
требуются, так как администратор этапа выполнения защищенного ре-
жима содержит реализацию подпрограмм KERNEL и USER, автоматичес-
ки перенаправляя их вызовы администратору.
Управление памятью
При разработке программ, работающих с динамической памятью,
обычно используются стандартные процедуры New, Dispose, GetMem и
FreeMem. Однако получить доступ к администратору памяти защищен-
ного режима Borland вы можете с помощью функций GlobalXXXX в мо-
дуле WinAPI.
Заметим, что функции GlobalXXXXPtr комбинируют в одной подп-
рограмме общие последовательности вызовов функций, такие как
GlobalAlloc, за которыми следуют вызовы GlobalLock, GlobalUnlock
или GlobalFree.
Подпрограммы управления памятью api
Таблица 17.2
----------------------T-----------------------------------------
¦ Функция ¦ Описание ¦
+---------------------+-----------------------------------------+
¦ GetFreeSpace ¦ Определяет объем свободной памяти в ди-¦
¦ ¦ намически распределяемой области. ¦
+---------------------+-----------------------------------------+
¦ GlobalAlloc ¦ Выделяет блок памяти в динамически расп-¦
¦ ¦ ределяемой области. ¦
+---------------------+-----------------------------------------+
¦ GlobalAllocPtr ¦ Выделяет и блокирует блок памяти (с по-¦
¦ ¦ мощью вызовов GlobalAlloc и GlobalLock).¦
¦ ¦ ¦
+---------------------+-----------------------------------------+
¦ GlobalCompact ¦ Переупорядочивает память, распределен-¦
¦ ¦ ную в динамической области, так что ос-¦
¦ ¦ вобождается заданный объем памяти. ¦
+---------------------+-----------------------------------------+
¦ GlobalDiscard ¦ Выгружает заданный объект памяти. ¦
+---------------------+-----------------------------------------+
¦ GlobalDosAlloc ¦ Распределяет память, к которой можно по-¦
¦ ¦ лучить доступ в реальном режиме DOS. Эта¦
¦ ¦ память будет существовать в первом мега-¦
¦ ¦ байте линейного адресного пространства. ¦
+---------------------+-----------------------------------------+
¦ GlobalDosFree ¦ Освобождает память, выделенную ранее с¦
¦ ¦ помощью GlobalDosAlloc. ¦
+---------------------+-----------------------------------------+
¦ GlobalFlags ¦ Получает информацию о блоке памяти. ¦
+---------------------+-----------------------------------------+
¦ GlobalFree ¦ Освобождает разблокированный блок памяти¦
¦ ¦ и делает его описатель недействительным.¦
+---------------------+-----------------------------------------+
¦ GlobalFreePtr ¦ Разблокирует и освобождает блок памяти¦
¦ ¦ с помощью GlobalUnlock и GlobalFree. ¦
+---------------------+-----------------------------------------+
¦ GlobalHandle ¦ Получает описатель объекта в памяти по¦
¦ ¦ заданному адресу сегмента. ¦
+---------------------+-----------------------------------------+
¦ GlobalLock ¦ Увеличивает счетчик ссылки блока памяти¦
¦ ¦ и возвращает указатель на него. ¦
+---------------------+-----------------------------------------+
¦ GlobalLockPtr ¦ То же, что и GlobalLock, но вместо опи-¦
¦ ¦ сателя воспринимает указатель. ¦
+---------------------+-----------------------------------------+
¦ GlobalLRUNewest ¦ Перемещает объект в памяти на новую не-¦
¦ ¦ давно используемую позицию, минимизируя,¦
¦ ¦ таким образом, вероятность выгрузки¦
¦ ¦ объекта. ¦
+---------------------+-----------------------------------------+
¦ GlobalLRUOldest ¦ Перемещает объект в памяти на самую¦
¦ ¦ "старую" недавно используемую позицию,¦
¦ ¦ максимизирую вероятность выгрузки объ-¦
¦ ¦ екта. ¦
+---------------------+-----------------------------------------+
¦ GlobalNorify ¦ Вызывает адрес экземпляра процедуры уве-¦
¦ ¦ домления, передавая описатель блока, ко-¦
¦ ¦ торый нужно выгрузить. ¦
+---------------------+-----------------------------------------+
¦ GlobalPageLock ¦ Увеличивает значение счетчика блокиров-¦
¦ ¦ ки для памяти, связанной с данным селек-¦
¦ ¦ тором. ¦
+---------------------+-----------------------------------------+
¦ GlobalPageUnlock ¦ Уменьшает значение счетчика блокировки¦
¦ ¦ для памяти, связанной с данным селекто-¦
¦ ¦ ром. ¦
+---------------------+-----------------------------------------+
¦ GlobalPtrHandle ¦ По заданному указателю на блок памяти¦
¦ ¦ возвращает описатель этого блока. ¦
+---------------------+-----------------------------------------+
¦ GlobalReAlloc ¦ Перераспределяет блок памяти. ¦
+---------------------+-----------------------------------------+
¦ GlobalReAllocPtr ¦ Разблокирует, перераспределяет и блоки-¦
¦ ¦ рует блок памяти (используя функции¦
¦ ¦ GlobalUnlock, GlobalReAlloc и¦
¦ ¦ GlobalLock). ¦
+---------------------+-----------------------------------------+
¦ GlobalSize ¦ Определяет текущий размер блока памяти. ¦
+---------------------+-----------------------------------------+
¦ GlobalUnfix ¦ Разблокирует блок памяти, блокированный¦
¦ ¦ ранее с помощью GlobalLock. ¦
+---------------------+-----------------------------------------+
¦ GlobalUnockPtr ¦ То же, что и GlobalUnlock, но вместо¦
¦ ¦ описателя воспринимает указатель. ¦
+---------------------+-----------------------------------------+
¦ LockSegment ¦ Блокирует заданный выгружаемый сегмент. ¦
+---------------------+-----------------------------------------+
¦ UnlockSegment ¦ Разблокирует сегмент. ¦
L---------------------+------------------------------------------
Функция GlobalAlloc используется для распределения блоков
памяти. Для их освобождения применяется функция GlobalFree. Адми-
нистратор памяти поддерживает три типа блоков памяти: фиксирован-
ный, перемещаемый и выгружаемый. Фиксированный блок остается в
одних и тех же адресах физической памяти. Перемещаемый блок может
перемещаться в физической памяти и освобождать место для других
запросов на выделение памяти, а выгружаемые блоки могут выгру-
жаться из памяти, освобождая место для других блоков. С помощью
передаваемых GlobalAlloc флагов вы можете выбрать один из этих
трех типов:
* gmem_Fixed (фиксированный)
* gmem_Moveable (перемещаемый)
* gmem_Moveable + gmem_Discardable (выгружаемый)
Прикладная программа обычно выделяет только перемещаемые
блоки памяти, которые представляются типом THandle в модуле
WinAPI. Описатель памяти - это значение размером в слово, которое
идентифицирует блок памяти аналогично тому, как описатель файла -
это значение размером в слово, идентифицирующее открытый файл.
Перед тем как вы сможете получить доступ к памяти, его нужно
заблокировать с помощью функции GlobalAlloc, а когда вы закончите
к нему обращаться, его нужно разблокировать с помощью функции
GlobalUnlock. GlobalLock возвращает полный 32-разрядный указатель
на первый байт блока. Смещение указателя всегда равно 0. В защи-
щенном режиме DOS селектор указателя - это тоже самое, что описа-
тель блока, но в Windows это не всегда так.
Правильная последовательность вызовов для выделения, блоки-
ровки, разблокировки или освобождения блока показана в приведен-
ном ниже примере. В данном примере H - это переменная типа
THandle, а P - указатель:
H := GlobalAlloc(gmem_Moveable, 8192); { выделение блока }
if H <> then { если память выделена }
begin
P := GlobalLock(H); { блокировка блока }
.
. { доступ к блоку через P }
.
GlobalUnlock(H); { разблокировать блок }
GlobalFree(H); { освободить блок }
end;
Блокировка и разблокировка блока при каждом обращении к нему
достаточно утомительна и ведет к ошибкам, и реально она необходи-
ма только для выгружаемых блоков и в прикладных программах
Windows, работающих в реальном режиме. Во всех других ситуациях
лучшим решением является блокировка блока сразу после его выделе-
ния и сохранение этого состояния до освобождения блока. С этой
целью модуль WinAPI включает в себя семейство подпрограмм-"оболо-
чек" GlobalXXXXPtr. Особый интерес представляет функция
GlobalAllocPtr, которая выделяет и блокирует блок памяти, и функ-
ция GlobalFreePtr, разблокирующая и освобождающая блок памяти. С
помощью этих подпрограмм приведенный выше пример можно упростить:
H := GlobalAlloc(gmem_Moveable, 8192); { выделение блока }
if H <> then { если память выделена }
begin
.
. { доступ к блоку }
.
GlobalFreePtr(P); { освободить блок }
end;
Вызвав функцию GlobalReAlloc, вы можете изменить размер или
атрибуты блока памяти, сохранив его содержимое. Функция
GlobalReAlloc возвращает новый описатель блока, который может от-
личаться от передаваемого функции описателя, если старый размер
или новый размер блок превышает 64К. Заметим, что в тех случаях,
когда старый размер блока и новый его размер меньше 64К,
GlobalReAlloc всегда может изменить размер блока, не изменяя его
описателя.
Функция GlobalReAlloc можно также использоваться для измене-
ния атрибутов блока. Это можно сделать, задав наряду с
gmem_Moveable или gmem_Discardable флаг gmem_Modify.
Функция GlobalReAlloc выполняет те же действия, что и
GlobalReAlloc, но обе они вместо описателей использует указатели.
Имеется также ряд других, менее часто используемых
GlobalXXXX. Все они подробно описаны в Главе 1 ("Справочник по
библиотеке") "Справочного руководства программиста".