Разделы

  Java, JavaScript
  Документация Perl
  Новости
  Документация ASP
  Flash
  Интернет протоколы
  Apache
  Уроки программирования
  Язык программирования C

Введение в программирование с помощью api

Уроки программирования
4.6 / 5 (64 оценок)

Win32 API (расшифровывается как интерфейс прикладных программ) - это множество подпрограмм-функций, на которых построена операционная система WINDOWS, которая использует 32х-битную адресацию, начиная с WINDOWS 95 и заканчивая WINDOWS XP. Разработчики WINDOWS сделали много усилий чтобы стандартизировать как названия функций, так и их параметры. Поэтому использовать их не так трудно, если усвоить некоторые общие концепции.

Большинство функций доступны для программ пользователя, написанных для Windows на любом языке программирования (в том числе и на ассемблере). Множество этих функций расширяется при переходе к следующей версии Windows, таким образом, обеспечивается совместимость разработанных ранее программ с новыми версиями операционной системы. Существуют и функции, которые не отражены в документации, или для своего применения требуют от программы специальных прав доступа к памяти.

Суть функций API понять гораздо легче, если представить, с каким файлам они вызываются и на какие группы эти функции разделяются. Ассемблер - это как раз тот удобный и простой способ, который позволит вам обращаться непосредственно к любой функции API, который находится в DLL-файле.

Секрет познания операционной системы через программирование на ассемблере заключается в том, что сам ассемблер не накладывает никаких ограничений на программу и данные, с которыми она работает. Это должен делать сам программист с целью защиты операционной системы от своих некорректных действий. Таким образом, основной целью системного программирования является написание корректных программ с неограниченными возможностями (в рамках операционной системы). Для сохранения корректности мы будем пользоваться определенными правилами программирования, которые будут понятны на конкретных примерах.

Типы программ. Процессоры стандарта Intel могут работать в трех основных режимах: реальном, виртуальном и защищенном. При включении компьютера его процессор работает в реальном режиме. После загрузки операционной системы (ОС) процессор может быть переключен программами ОС в другие режимы. В реальном и виртуальном режимах используется 16-битная адресация с фиксированными сегментами по 64К. В защищенном режиме используется 32х-битная адресация с неограниченными сегментами, и адрес в памяти формируется (на аппаратном уровне) с помощью дескрипторных таблиц, в которых задаются начальные адреса сегментов, их длина, и права доступа к памяти и к портам для процессов, которые их используют. Кроме того, в защищенном режиме реализовано аппаратное переключение между задачами с помощью специальных таблиц.

Особенности вызова функций API. Наиболее перспективным с точки зрения программирования является защищенный режим, потому что он использует все аппаратные возможности компьютера. Таким образом, функции API для Windows играют ту же роль, что и прерывание INT 21h для DOS в реальном или виртуальном режиме, но, различия между ними весьма существенные. Перечислим их:

* Функции API не отменяют, а заменяют программные прерывания. Механизм обработки аппаратных прерываний остается на уровне драйверов устройств;
* Стандарт вызова функций API основан на передаче параметров через стек (а не через регистры);
* Значение каждой функции возвращается в регистре EAX. Если функция возвращает структуру данных, то регистр EAX содержит логическую признак исполнения, а адрес структуры необходимо передать функцию как параметр;
* Функции API работающие в защищенном режиме процессора, а прерывания DOS - в реальном или виртуальном режиме.

Функции API хранятся в различных библиотеках динамической компоновки, которые находятся в файлах с расширением DLL, например, kernel32.dll, user32.dll, gdi32.dll и др. Эти файлы находятся в системном каталоге Windows (например, "C: \ Windows \ System"). В случае необходимости, программист может создать DLL-файл с набором своих функций.

Программы Windows обращаются к функциям API с помощью команд аппаратного вызова CALL, например: call MessageBoxA, где MessageBoxA - 32х-битная адрес функции. Именно это название функции фигурирует в файле user32.dll (посмотрите редактором этот файл). Перечень возможных функций есть в файле H: / tasm/lib/Import32.lib, который называется библиотекой импорта.

Параметры для выполнения любой функции API перед ее вызовом должны засилатися в стек, начиная с последнего параметра (см. текст программы). Поэтому каждый параметр 32х-битным числом (в котором могут использоваться не все биты). Параметрами довольно часто бывают специальные дескрипторы - Хэндли (HANDLE) и атомы.

Дескрипторы (Хендли и атомы) - это уникальные целые числа, которые Windows использует для идентификации объектов, которые создаются или используются в системе. Хендли занимают по 4 байта, а атомы - по 2 байта. Хендли идентифицируют окна, меню, блоки памяти, экземпляры программы, устройства вывода, файлы, аудио и видео потоки, и другие объекты. Атомы идентифицируют стандартные иконки, курсоры и объекты, которые не изменяются при следующей загрузке системы.

Большинство дескрипторов являются значениями индексов внутренних таблиц, которые Windows использует для доступа и управления своими объектами. Конечно, программы пользователя (употребления) в защищенном режиме не имеют прав доступа к этим таблицам. Поэтому, когда необходимо получить или изменить данные, связанные с определенным объектом Windows, обиход использует соответствующую функцию API с параметром хендла этого объекта. Таким образом Windows обеспечивает защиту своих данных при работе в многозадачном режиме.

Структура данных для использования системных функций



Для использования более сложных функций API необходимо использовать специальные структуры данных. Вся концепция программирования в WINDOWS основана на четком упорядочении структур данных, связанных с ними программ-функций и констант-параметров. Данные, связанные с выполнением одной функции объединяются в блок определенной длины (он называется структурой). Элементами таких структур могут быть другие структуры и т.д.

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

1. функции, которые выполняют любое действие;
2. функции, которые получают любую информацию.

Работа с памятью

Память является основным ресурсом при программировании в многозадачной среде. Множество свободных фрагментов памяти называется хип (от английского слова HEAP). Программист может выделить для своей программы блок памяти любой длины, не превышающей общий объем свободной памяти. В Windows память выделяется в 2 этапа:

* Изначально система выделяет фрагмент виртуальной памяти, который получает свой хэндл, но не получает реального адреса;
* Затем система размещает (блокирует) этот фрагмент в реальной памяти и фрагмент получает начальный адрес.

После того, как программист получает адрес начала выделенного блока, он может ее использовать. Ячейки с адресами до начала и после конца блока использовать нельзя, потому что они принадлежат другим программам или системе.

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

Для открытия, чтения и записи файлов используются соответствующие функции API, описание которых вы найдете после текста программы.



Другие материалы по теме:

- Классификация case-средств
- Eclipse
- Способы описания алгоритмов
- Построение алгоритмов
- Использование языков и сред программирования как средств обучения


📌 smti.ru © 2026 SMTI.RU: инструменты, знания и сообщество для создания веб-проектов | Обратная связь