WinLite – Win32 API

www.delphi.agava.ru

Зміст

1. Введення
2. Існуючі рішення

3. Принципи побудови API-бібліотеки

4. Бібліотека WinLite
5. Приклад програми на основі бібліотеки WinLite

1. Введення

Яку сучасну програму або програмну технологію можна представити як сукупність програмних “шарів”. Кожен з цих шарів виробляє свою власну роботу, яка полягає в підвищенні рівня абстракції вироблюваних операцій. Так, самий нижчий шар (шари) вводить поняття, які дозволяють абстрагуватися від використовуваного обладнання; наступний шар (Шари) дозволяє програмісту абстрагуватись від складної послідовності викликів функцій, вводячи таке поняття як протокол і т.д. Практично в будь-якому сучасному програмному продукті можна виявити і виділити близько десятка послідовних шарів абстракції.

Абстракція від устаткування і низькорівневих протоколів вводиться в ядра операційних систем у вигляді бібліотек API (Application Program Interface). Однак сучасні тенденції призводять до необхідності абстрагування і від самих операційних систем, що дозволяє переносити програми з одного операційної системи на іншу шляхом простої перекомпіляції (трансльовані програми, в основному, взагалі не вимагають ніяких дій по перенесенню).

Абстракцію, яка доступна програмісту у вигляді бібліотек API можна назвати базової. Це найнижчий рівень абстракції, який доступний для прикладного програмування. На рівні ядра системи доступні і більш низькі рівні абстракції, однак для їх використання необхідно розробляти спеціалізовані програми (драйвера, модулі). Базовий рівень абстракції (API) надає максимально широкі можливості для прикладного програмування і є найбільш гнучким. Однак, програмування з використанням API є набагато більш трудомістким і приводить до значно більших обсягів вихідного коду програми, ніж програмування з використанням додаткових бібліотек.

Додаткові бібліотеки поставляються з багатьма засобами розробки з метою зменшення трудомісткості і термінів розробки програм, що в підсумку призводить до підвищення їх конкурентноздатності. Але застосування додаткових бібліотек абстракцій призводить до різкого збільшення розмірів компільованих програм, через те що в програму включається код використовуваних бібліотек, до того ж це включення часто буває неефективним – В програму включаються невживані ділянки коди. Крім того, чим більше рівень абстракції бібліотеки, тим складніше її код, і тим більше труднощів виникає при вирішенні складних завдань. Доводиться враховувати безліч взаємозв’язків і взаємних впливів окремих елементів і процесів бібліотеки один на одного. Крім того, структура і функціональність будь-якої бібліотеки зазвичай розраховується на задоволення всіх потенційно виникаючих завдань, що призводить до її громіздкості і неефективності.

У Delphi використовується дуже потужна і складна бібліотека VCL (Visual Components Library), яка крім безпосередніх абстракцій вводить також і безліч своїх функціональних класів. У цій бібліотеці знаходяться компоненти для візуального відображення інформації, роботи з базами даних, з системними об’єктами, компоненти для роботи з Internet-протоколами, класи для написання своїх COM-об’єктів і багато іншого. Модулі бібліотеки підключаються до компіляції в міру необхідності, проте базовий розмір найпростішого діалогового проекту з однією формою перевищує 300кб (із статично скомпонована бібліотекою). І такий розмір у багатьох випадках може виявитися занадто великим, особливо якщо програма не вимагає великої функціональності в інтерфейсі.

Для вирішення цієї проблеми можна відмовитися від використання бібліотеки VCL, і програмувати, використовуючи базовий набір функцій Win32 API. Однак, якщо при розробці лінійних, недіалогових, нерезидентних програм не виникає жодних труднощів, то розробка програм, що вимагають активної взаємодії з користувачем або системою, стає трудомісткою. Структурний програмування, рекомендований в таких випадках, виявляється неефективним і трудомістким.

Дана стаття присвячена проблемі створення і використання компактної об’єктно-орієнтованої бібліотеки, яка б полегшила побудову невеликих і ефективних програм на основі Win32 API.

2. Існуючі рішення

Автору відомі три об’єктно-орієнтовані бібліотеки, які можна розглядати як альтернативу бібліотеці VCL при написанні компактних програм. Це бібліотеки класів XCL, ACL і KOL. Всі бібліотеки безкоштовні і поставляються у вихідних кодах.

Бібліотека ACL

(API control library)

Автор:

Олександр Боковиков, Єкатеринбург, Росія

Сторінка:

http://a-press.ur.ru/pc/bokovikov

E-Mail:

abb@adx.ru

Класи і модулі:

TFont, TFonts, TControl, TWinControl, TStdControl, TLabel,
TEdit, TListBox, TButton, TCheckBox, TComboBox, TGroupBox,
TProgressBar, TKeyboard

Бібліотека XCL

(Extreme class library)

Автор:

Vladimir Kladov (Mr.Bonanzas)

Сторінка:

http://xcl.cjb.net

E-Mail:

bonanzas@xcl.cjb.net

Класи і модулі:

XForm, XApplet, XCanvas, XPen, XBrush, XFont, ZDDB, ZHiBmp,
ZDIBitmap, ZBitmap, ZIcon, ZGifDecoder, ZGif, ZJpeg, XLabel,
XButton, XBevel, XPanel, XSplitPanel, XStatus, XGrep, XGroup,
XCheckBox, XRadioBox, XPaint, XScroller, XScrollBox, XScrollBoxEx,
XEdit, XNumEdit, XCombo, XGrid, XListView, XMultiList, XNotebook,
XTabs, XTabbedNotebook, XCalendar, XGauge, XGaugePercents,
XHysto, XHystoEx, XImageList, XImgButton, XTooltip, XCustomForm,
XDsgnForm, XDsgnNonvisual, CLabel, CPaint, CButton, CEdit,
CMemo, CCheckBox, CRadioBox, CListBox, CComboBox, ZList,
ZMenu, ZPopup, ZMainMenu, ZPopupMenu, ZTimer, ZStrings,
ZStringList, ZIniFile, ZThread, ZQueue, ZFileChange, ZDirChange,
ZOpenSaveDialog, ZOpenDirDialog, ZTree, ZDirList, ZDirListEx,
ZRegistry, ZStream, ZFileStream, ZMemoryStream, XStrUtils,
XDateUtils, XFileUtils, XWindowUtils, XPrintUtils, XShellLinks,
XJustOne, XJustOneNotify, XPascalUnit, XSysIcons, XCanvasObjectsManager,
XRotateFonts, XFocusPainter, XFormsStdMouseEvents, XFormsStdKeyEvents,
XFormAutoSizer, XAligner, XControlAutoPlacer, XMfcAntiFlicker,
XSplitSizer, XResizeAntiFlicker, XCaretShower, XEditMouseSelect,
XEditClipboard, XEditUndo, XListMouseSel, XListKeySel, XListEdit,
ZNamedTags, XBtnRepeats, XBufLabels, XBackgrounds, XWndDynHandlers

Бібліотека KOL

(Key object library)

Автор:

Vladimir Kladov (Mr.Bonanzas)

Сторінка:

http://xcl.cjb.net

E-Mail:

bonanzas@xcl.cjb.net

Класи і модулі:

TObj, TList, TGraphicTool, TCanvas, TControl, TTimer,
TTrayIcon, TStream, TStrList, TDirList, TIniFile

Як видно зі списку наведених для кожної бібліотеки класів, ці бібліотеки предендуют скоріше не на допомогу при написанні програм з використанням Win32 API, а намагаються створити більш високий рівень абстракції чим API, за Принаймні в графічної частини (особливо це відноситься до XCL). Більш того, ієрархія і перелік об’єктів співпадають з відповідними структурами в бібліотеці VCL, що швидше за все пов’язано з бажанням авторів забезпечити логічну сумісність з VCL при побудові програм на основі цих бібліотек.

Дані бібліотеки не забезпечують мінімального розміру програми, за рахунок того що надають більш високий рівень абстракції. Вони є Компроміс між програмуванням з використанням VCL і програмуванням на чистому API.

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 і побудовані на основі нього віконні класи:

Бібліотека може бути використана спільно з VCL. На перший погляд, це можливість є абсурдною і непотрібною, так як про економію розміру в цьому випадку не може бути й мови. Однак, іноді бувають моменти, коли реалізація специфічних віконних елементів на основі об’єктів TWinControl або TCustomControl може бути утруднена або неефективна через їх складності і неочевидного поведінки. У цьому випадку, можна реалізувати такий елемент на базі класу TLiteWindow – він буде вести себе стандартним чином, як і годиться поводитися стандартному віконному елементу Win32.

Завдяки своїй простий архітектурі бібліотека може бути використана в многопоточной програмі. Звичайно, ви не зможете викликати методи класів одного потоку з іншого потоку без відповідної синхронізації. Однак, ви можете безперешкодно створювати віконні класи в різних потоках без блокування і синхронізації, а також посилати повідомлення віконним класам в іншому потоці.

Практична порада: при API-програмуванні програміст повинен сам стежити за коректним звільненням численних ресурсів, які займає програма під час виконання. Тому, для полегшення цього завдання використовуйте яку-небудь контролюючу утиліту, наприклад MemProof або Numega BoundsChecker. Коректне звільнення зайнятих ресурсів украй необхідне!

Для редагування шаблонів діалогів можна використовувати будь-який редактор ресурсів, наприклад Borland Resource WorkShop, правда він декілька незручний, а остаточний результат все одно доводиться коригувати вручну.

Вся документація необхідна для API-програмування міститься в поставляються компанією Microsoft компакт-дисках з документацією під загальною назвою MSDN (Microsoft Developer’s Network). Існує online-версія документації по адресою http://msdn.microsoft.com. Урізана версія MSDN, що містить основні файли допомоги, поставляється з Delphi.

Перш ніж ви вирішите працювати над своїм проектом в руслі Win32 API, подумайте, а навіщо вам це потрібно? У переважній кількості випадків розмір програми не має ніякого значення. Я не хочу сказати, що API-програмування складніше ніж VCL-програмування. У багатьох випадках легше вивчити і написати 10 викликів API з купою аргументів і розуміти, що відбувається, ніж написати 1 виклик простій, на перший погляд, VCL-інструкції і потім довго досліджувати нетрі VCL в пошуках відповіді. Просто API-програмування – Це інша культура, до якої ви, можливо, не звикли. І первісна робота може викликати у вас сильне розчарування. API-програмування вимагає скрупульозності, ретельності і уважного вивчення документації.

Ті ж, хто наважився програмувати на API, поряд з бібліотекою WinLite можуть спільно використовувати невізуальні класи як з складу VCL (модулі SysUtils, Classes), так і багато сторонніх – природно, що розмір вашої програми при цьому збільшиться.

Заслуговує на увагу робота Володимира Кладова по зміни функціональності обов’язкового модуля system.pas. Зі часів перших версій Turbo Pascal цей модуль за замовчуванням компонується у виконуваний код програми. Код модуля реалізує багато принципів і рішення закладені в синтаксис і логіку мови Object Pascal, і зміна цього модуля дозволяє модифікувати реалізацію цієї логіки. Таке рішення є специфічним для мови Object Pascal на відміну, наприклад, від C / C + +, де компілятор і абсолюдно всі модулі ніяк не зв’язані. Зміна модуля system.pas, а саме його розбиття на блоки і скорочення рідко використовуваних ділянок коду дозволило скоротити постійні (не змінні) витрати приблизно на 8 кб. Звичайно, для великих проектів, таке скорочення може бути і непомітним, проте цікавий сам принцип.

4. Бібліотека WinLite


5. Приклад програми на основі бібліотеки WinLite

У доданому прикладі, побудованому на основі розробленої автором бібліотеки API-програмування WinLite, розглядаються наступні проблеми:

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*