3. Принципы построения API-библиотеки
Стандартным видом API-программирования является
структурное программирование. Примеры такого
программирования на Win32 API есть практически в
любой книжке по Borland Pascal, Borland C++, Microsoft Visual C++ и
другим системам разработки. Множество примеров
API-программирования на С содержится в поставке
Microsoft Visual C++.
Структурное программирование с оконными
функциями, процедурами обработки команд, не в
состоянии обеспечить быструю и эффективную
разработку программ. В современной ситуации
большинство программистов привыкло к
объектно-ориентированному методу, с
возможностью инкапсуляции, наследования и
переопределения методов объектов. Такое
программирование оказывается наиболее
эффективным.
Кроме того, для построения эффективной
API-библиотеки прежде всего нужно выяснить, какие
задачи при работе с Win32 API являются наиболее
трудоемкими. Практика показывает, что наиболее
неудобным и трудоемким элементом является
реализация основного диспетчера логики
программы - оконной функции. Реализация этой
функции в качестве метода класса, а не простой
глобальной функции, позволила бы улучшить
структуру кода и облегчить программирование
путем инкапсулирования всех переменных внутри
оконного класса.
Программирование может быть еще более
облегчено, есть возпользоваться механизмом
message-процедур языка Object Pascal. Вызов этих процедур
полностью лежит на компиляторе и корневом
объекте TObject и включает в себя методы Dispatch,
DefaultHandler, а также все методы, объявленные с
директивой message. Такое решениее позволит
полностью отказаться от громоздкого оператора
case в оконной функции.
Учитывая все вышеперечисленное автором была
создана компактная библиотека оконных классов
WinLite. Эта библиотека является минимальной, она не
вводит более высоких уровней абстракции чем
существуют в Win32 API - она только облегчает работу,
переводом программирования в
объектно-ориентированное русло. Размер
библиотеки очень небольшой и вся она помещается
в один модуль. Библиотека реализует базовый
класс TLiteFrame и построенные на основе него оконные
классы:
- TLiteWindow - класс окна, с возможностью subclass'инга;
- TLiteDialog - класс немодального диалога;
- TLiteDialogBox - класс модального диалога.
Библиотека может быть использована совместно с
VCL. На первый взгляд, это возможность является
абсурдной и ненужной, так как об экономии размера
в этом случае не может быть и речи. Однако, иногда
бывают моменты, когда реализация специфических
оконных элементов на основе объектов TWinControl или
TCustomControl может быть затруднена или неэффективна
из-за их сложности и неочевидного поведения. В
этом случае, можно реализовать такой элемент на
базе класса TLiteWindow - он будет вести себя
стандартным образом, как и полагается вести себя
стандартному оконному элементу Win32.
Благодаря своей простой архитектуре
библиотека может быть использована в
многопоточной программе. Конечно, вы не сможете
вызывать методы классов одного потока из другого
потока без соответствующей синхронизации.
Однако, вы можете беспрепятственно создавать
оконные классы в различных потоках без
блокировки и синхронизации, а также посылать
сообщения оконным классам в другом потоке.
Практический совет: при API-программировании
программист должен сам следить за корректным
освобождением многочисленных ресурсов, которые
занимает программа во время выполнения. Поэтому,
для облегчения этой задачи используйте
какую-либо контролирующую утилиту, например MemProof
или Numega BoundsChecker. Корректное освобождение занятых
ресурсов крайне необходимо !
К тому же, прежде чем вы решите работать над
своим проектом в русле Win32 API, подумайте, а зачем
вам это нужно? В подавляющем числе случаев размер
программы не имеет никакого значения. Я не хочу
сказать, что API-программирование сложнее чем
VCL-программирование. Во многих случаях легче
изучить и написать 10 вызовов API с кучей
аргументов и понимать, что происходит, чем
написать 1 вызов простой, на первый взгляд,
VCL-инструкции и потом долго исследовать дебри VCL в
поисках ответа. Просто API-программирование - это
другая культура, к которой вы, возможно, не
привыкли. И первоначальная работа может вызвать
у вас сильное разочарование. API-программирование
требует дотошности, кропотливости и
внимательного изучения документации.
Те же, кто отважился программировать на API,
наряду с библиотекой WinLite могут совместно
использовать невизуальные классы как из состава
VCL (модули SysUtils, Classes), так и многие сторонние -
естественно, что размер вашей программы при этом
увеличится.
Для редактирования шаблонов диалогов можно
использовать любой редактор ресурсов, например
Borland Resource WorkShop, правда он несколько неудобен, а
окончательный результат все равно приходится
корректировать вручную.
|