Win API
Win API • Любую современную программу или программную технологию можно представить как совокупность программных "слоев". Каждый из этих слоев производит свою собственную работу, которая заключается в повышении уровня абстракции производимых операций. • Самый низший слой (слои) вводит понятия, которые позволяют абстрагироваться от используемого оборудования; • следующий слой (слои) позволяет программисту абстрагироваться от сложной последовательности вызовов функций, вводя такое понятие как протокол и т. д. • Практически в любом современном программном продукте можно обнаружить и выделить около десятка последовательных слоев абстракции.
Win API • Абстракция от оборудования и низкоуровневых протоколов вводится в ядра операционных систем в виде библиотек API (Application Program Interface). • Win API - это набор функций, предоставляемых операционной системой каждой программе. Эти функции находятся в стандартных динамически компонуемых библиотеках (Dynamic Linked Library, DLL), таких как kernel 32. dll, user 32. dll, gdi 32. dll. • Эти файлы находятся в директории Window. Каждая программа должна самостоятельно заботится о том, чтобы подключить эти библиотеки. DLL могут подключаться к программе статически и динамически.
Win API • Современные тенденции приводят к необходимости абстрагирования и от самих операционных систем, что позволяет переносить программы с одной операционной системы на другую путем простой перекомпиляции (транслируемые программы, в основном, вообще не требуют никаких действий по переносу).
Win API • Абстракцию, которая доступна программисту в виде библиотек API можно назвать базовой. • Это самый низкий уровень абстракции, который доступен для прикладного программирования. • На уровне ядра системы доступны и более низкие уровни абстракции, однако для их использования необходимо разрабатывать специализированные программы (драйвера, модули). • Базовый уровень абстракции (API) предоставляет максимально широкие возможности для прикладного программирования и является наиболее гибким. • Однако, программирование с использованием API является гораздо более трудоемким и приводит к значительно большим объемам исходного кода программы, чем программирование с использованием дополнительных библиотек.
Win API • Дополнительные библиотеки поставляются со многими средствами разработки с целью уменьшения трудоемкости и сроков разработки программ, что в итоге приводит к повышению их конкурентноспособности. • Применение дополнительных библиотек абстракций приводит к резкому увеличению размеров откомпилированных программ, из-за того что в программу включается код используемых библиотек, к тому же это включение зачастую бывает неэффективным - в программу включаются неиспользуемые участки кода. • Чем больше уровень абстракции библиотеки, тем сложнее ее код, и тем больше трудностей возникает при решении сложных задач. Приходится учитывать множество взаимосвязей и взаимных влияний отдельных элементов и процессов библиотеки друг на друга. • Структура и функциональность любой библиотеки обычно рассчитывается на удовлетворение всех потенциально возникающих задач, что приводит к ее громоздкости и неэффективности.
Win API • В Delphi используется очень мощная и сложная библиотека VCL (Visual Components Library), которая помимо непосредственных абстракций вводит также и множество своих функциональных классов. • В этой библиотеке находятся компоненты для визуального отображения информации, работы с базами данных, с системными объектами, компоненты для работы с Internet-протоколами, классы для написания своих COMобъектов и многое другое. • Модули библиотеки подключаются к компиляции по мере необходимости, однако базовый размер простейшего диалогового проекта с одной формой превышает 300 к. Б (со статически скомпонованной библиотекой). • Такой размер во многих случаях может оказаться слишком большим, особенно если программа не требует большой функциональности в интерфейсе.
Win API • Для решения этой проблемы можно отказаться от использования библиотеки VCL, и программировать, используя базовый набор функций Win 32 API. • Однако, если при разработке линейных, недиалоговых, нерезидентных программ не возникает никаких трудностей, то разработка программ, требующих активного взаимодействия с пользователем или системой, становится трудоемкой. • Структурное программирование, рекомендуемое в таких случаях, оказывается неэффективным и трудоемким.
Типы данных • Так как система Windows написана на Си, все описания функций Win API даны в соответствии с синтаксисом именно этого языка, а не Паскаля.
Типы данных • • • • WCHAR = Wide. Char; LPSTR = PChar; LPCSTR = PChar; LPWSTR = PWide. Char; LPCWSTR = PWide. Char; DWORD = Integer; BOOL = Long. Bool; PBOOL = ^BOOL; PINT = ^Integer; PWORD = ^Word; PDWORD = ^DWORD; LPDWORD = PDWORD; UCHAR = Byte; PUCHAR = ^Byte; SHORT = Smallint; • • • • UINT = Integer; PUINT = ^UINT; ULONG = Longint; PULONG = ^ULONG; LCID = DWORD; LANGID = Word; int = Integer; long = Long. Int; PVOID = Pointer; HANDLE = THandle; LPPOINT = TPoint; RECT = TRect; LPRECT = PRect; LPSIZE = PSize; BITMAP = TBitmap;
Типы данных • Все типы, приведённые в первой части таблицы, в целях совместимости описаны в модуле Windows. dcu, поэтому их можно использовать наравне с обычными типами Delphi. Кроме этих типов общего назначения существуют ещё специальные. • Например, дескриптор окна имеет тип HWND, первый параметр сообщения - тип WPARAM. • Эти специальные типы также описаны в Windows. dcu. В некоторых имена типов, встречающихся в справке, и соответствующих им типов из Windows. dcu отличаются только добавлением буквы. • Не следует путать тип TBitmap, определённый в Windows. dcu, с классом TBitmap, определённым в Graphics. dcu.
Строки
Строки
Строки
Дескрипторы • Программируя в Delphi, мы быстро привыкаем к тому, что каждый объект реализуется экземпляром соответствующего класса. Например, кнопка реализуется экземпляром класса TButton, контекст устройства - классом TCanvas. • Когда создавались первые версии Windows, объектноориентированный метод программирования ещё не был общепризнанным, поэтому он не был реализован. • Современные версии Windows частично унаследовали этот недостаток, поэтому в большинстве случаев приходится работать по старинке, тем более что DLL могут экспортировать только функции, но не классы.
Дескрипторы • Когда мы создаём некоторый объект в Windows, ему присваивается уникальный 32 -разрядный номер, называемый дескриптором (handle). • В дальнейшем при работе с этим объектом каждой функции передаётся этот дескриптор. • В этом и заключается главное различие между методами класса и функциями Win API. • Первые связаны с тем экземпляром класса, через который они вызываются, и поэтому не требуют явного указания на объект. • Вторым необходимо такое указание, так как они сами по себе никак не связаны ни с одним объектом.
Дескрипторы • Не следует думать, что при работе с Win API следует полностью отказываться от классов Delphi. Эти методы прекрасно работают вместе. Правда, внутренние механизмы Delphi не могут включиться, если изменение объекта происходит через Win API. • Например, если спрятать окно не с помощью метода Hide, а с помощью вызова функции Win API Show. Window(Handle, SW_Hide), не возникнет событие On. Hide, потому что оно запускается теми самыми внутренними механизмами Delphi. Но такие недоразумения случаются обычно только тогда, когда функциями Win API дублируется то, что можно сделать и с помощью Delphi.
Дескрипторы • Для вызова функций Win API объекта, созданного с помощью Delphi, используйте свойство Handle. В нём хранится дескриптор. • В некоторых случаях класс Delphi инкапсулирует несколько объектов Windows. Например, класс TBitmap включает в себя HBitmap и HPalette - картинку и палитру к ней. Соответственно, он хранит два дескриптора - в свойствах Handle и Palette.
Дескрипторы • Все экземпляры классов, созданные в Delphi, должны удаляться. В некоторых случаях это происходит автоматически, в некоторых программист должен сам позаботиться об их удалении. • Аналогичная ситуация и с объектами, создаваемыми в Win API. Если посмотреть справку по функции, создающей какой-то объект, то там обязательно будет информация о том, какой функцией можно удалить объект и может ли система сделать это автоматически. • Во многих случаях совершенно разные объекты могут удаляться одной и той же функцией. Так, функция Delete. Object удаляет косметические карандаши, геометрические карандаши, кисти, шрифты, регионы, растровые изображения и палитры.
Дескрипторы
Сообщения
Сообщения
Сообщения В Delphi для реакции на каждое сообщение обычно создается свой метод. В Windows одна процедура, называемая оконной, обрабатывает все сообщения.
Сообщения
Сообщения
Сообщения
Сообщения • Обработка сообщений в Delphi
Сообщения